{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.9.6 (default, May  7 2023, 23:32:44) \n",
      "[Clang 14.0.3 (clang-1403.0.22.14.1)]\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "print(sys.version)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "zsh:1: command not found: nvidia-smi\n"
     ]
    }
   ],
   "source": [
    "!nvidia-smi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "zsh:1: command not found: nvcc\n"
     ]
    }
   ],
   "source": [
    "!nvcc -V"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple\n",
      "Requirement already satisfied: torch==2.1.2 in ./venv/lib/python3.10/site-packages (2.1.2)\n",
      "Requirement already satisfied: filelock in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (3.13.1)\n",
      "Requirement already satisfied: typing-extensions in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (4.9.0)\n",
      "Requirement already satisfied: sympy in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (1.12)\n",
      "Requirement already satisfied: networkx in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (3.2.1)\n",
      "Requirement already satisfied: jinja2 in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (3.1.2)\n",
      "Requirement already satisfied: fsspec in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (2023.12.2)\n",
      "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (12.1.105)\n",
      "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (12.1.105)\n",
      "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (12.1.105)\n",
      "Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (8.9.2.26)\n",
      "Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (12.1.3.1)\n",
      "Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (11.0.2.54)\n",
      "Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (10.3.2.106)\n",
      "Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (11.4.5.107)\n",
      "Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (12.1.0.106)\n",
      "Requirement already satisfied: nvidia-nccl-cu12==2.18.1 in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (2.18.1)\n",
      "Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (12.1.105)\n",
      "Requirement already satisfied: triton==2.1.0 in ./venv/lib/python3.10/site-packages (from torch==2.1.2) (2.1.0)\n",
      "Requirement already satisfied: nvidia-nvjitlink-cu12 in ./venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch==2.1.2) (12.3.101)\n",
      "Requirement already satisfied: MarkupSafe>=2.0 in ./venv/lib/python3.10/site-packages (from jinja2->torch==2.1.2) (2.1.3)\n",
      "Requirement already satisfied: mpmath>=0.19 in ./venv/lib/python3.10/site-packages (from sympy->torch==2.1.2) (1.3.0)\n",
      "Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple\n",
      "Requirement already satisfied: torchvision==0.16.2 in ./venv/lib/python3.10/site-packages (0.16.2)\n",
      "Requirement already satisfied: numpy in ./venv/lib/python3.10/site-packages (from torchvision==0.16.2) (1.26.1)\n",
      "Requirement already satisfied: requests in ./venv/lib/python3.10/site-packages (from torchvision==0.16.2) (2.31.0)\n",
      "Requirement already satisfied: torch==2.1.2 in ./venv/lib/python3.10/site-packages (from torchvision==0.16.2) (2.1.2)\n",
      "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in ./venv/lib/python3.10/site-packages (from torchvision==0.16.2) (10.1.0)\n",
      "Requirement already satisfied: filelock in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (3.13.1)\n",
      "Requirement already satisfied: typing-extensions in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (4.9.0)\n",
      "Requirement already satisfied: sympy in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (1.12)\n",
      "Requirement already satisfied: networkx in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (3.2.1)\n",
      "Requirement already satisfied: jinja2 in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (3.1.2)\n",
      "Requirement already satisfied: fsspec in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (2023.12.2)\n",
      "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (12.1.105)\n",
      "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (12.1.105)\n",
      "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (12.1.105)\n",
      "Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (8.9.2.26)\n",
      "Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (12.1.3.1)\n",
      "Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (11.0.2.54)\n",
      "Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (10.3.2.106)\n",
      "Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (11.4.5.107)\n",
      "Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (12.1.0.106)\n",
      "Requirement already satisfied: nvidia-nccl-cu12==2.18.1 in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (2.18.1)\n",
      "Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (12.1.105)\n",
      "Requirement already satisfied: triton==2.1.0 in ./venv/lib/python3.10/site-packages (from torch==2.1.2->torchvision==0.16.2) (2.1.0)\n",
      "Requirement already satisfied: nvidia-nvjitlink-cu12 in ./venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch==2.1.2->torchvision==0.16.2) (12.3.101)\n",
      "Requirement already satisfied: charset-normalizer<4,>=2 in ./venv/lib/python3.10/site-packages (from requests->torchvision==0.16.2) (3.3.2)\n",
      "Requirement already satisfied: idna<4,>=2.5 in ./venv/lib/python3.10/site-packages (from requests->torchvision==0.16.2) (3.6)\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in ./venv/lib/python3.10/site-packages (from requests->torchvision==0.16.2) (2.1.0)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in ./venv/lib/python3.10/site-packages (from requests->torchvision==0.16.2) (2023.11.17)\n",
      "Requirement already satisfied: MarkupSafe>=2.0 in ./venv/lib/python3.10/site-packages (from jinja2->torch==2.1.2->torchvision==0.16.2) (2.1.3)\n",
      "Requirement already satisfied: mpmath>=0.19 in ./venv/lib/python3.10/site-packages (from sympy->torch==2.1.2->torchvision==0.16.2) (1.3.0)\n",
      "Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple\n",
      "Requirement already satisfied: matplotlib==3.8.2 in ./venv/lib/python3.10/site-packages (3.8.2)\n",
      "Requirement already satisfied: contourpy>=1.0.1 in ./venv/lib/python3.10/site-packages (from matplotlib==3.8.2) (1.2.0)\n",
      "Requirement already satisfied: cycler>=0.10 in ./venv/lib/python3.10/site-packages (from matplotlib==3.8.2) (0.12.1)\n",
      "Requirement already satisfied: fonttools>=4.22.0 in ./venv/lib/python3.10/site-packages (from matplotlib==3.8.2) (4.47.0)\n",
      "Requirement already satisfied: kiwisolver>=1.3.1 in ./venv/lib/python3.10/site-packages (from matplotlib==3.8.2) (1.4.5)\n",
      "Requirement already satisfied: numpy<2,>=1.21 in ./venv/lib/python3.10/site-packages (from matplotlib==3.8.2) (1.26.1)\n",
      "Requirement already satisfied: packaging>=20.0 in ./venv/lib/python3.10/site-packages (from matplotlib==3.8.2) (23.2)\n",
      "Requirement already satisfied: pillow>=8 in ./venv/lib/python3.10/site-packages (from matplotlib==3.8.2) (10.1.0)\n",
      "Requirement already satisfied: pyparsing>=2.3.1 in ./venv/lib/python3.10/site-packages (from matplotlib==3.8.2) (3.1.1)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in ./venv/lib/python3.10/site-packages (from matplotlib==3.8.2) (2.8.2)\n",
      "Requirement already satisfied: six>=1.5 in ./venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib==3.8.2) (1.16.0)\n"
     ]
    }
   ],
   "source": [
    "# !pip install torch==2.1.2\n",
    "# !pip install torchvision==0.16.2\n",
    "# !pip install matplotlib==3.8.2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torchvision\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import numpy as np\n",
    "from torchvision import datasets, transforms\n",
    "import matplotlib.pyplot as plt\n",
    "from torch.utils.data import DataLoader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cpu\n"
     ]
    }
   ],
   "source": [
    "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
    "print(device)\n",
    "\n",
    "if device == \"cuda\":\n",
    "    for i in range(torch.cuda.device_count()):\n",
    "        print(torch.cuda.get_device_name(i))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize((0.5, ), (0.5,))\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n"
     ]
    }
   ],
   "source": [
    "train_dataset = datasets.CIFAR10(root=\"./data\", train=True, download=True, transform=transform)\n",
    "validation_dataset = datasets.CIFAR10(root=\"./data\", train=False, download=True, transform=transform)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_dataloader = DataLoader(train_dataset, batch_size=32, shuffle=True)\n",
    "validation_dataloader = DataLoader(validation_dataset, batch_size=32, shuffle=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([3, 32, 32])\n",
      "torch.Size([32, 32, 3])\n",
      "label is deer\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cifar_labels = [\n",
    "    \"airplane\",\n",
    "    \"automobile\",\n",
    "    \"bird\",\n",
    "    \"cat\",\n",
    "    \"deer\",\n",
    "    \"dog\",\n",
    "    \"frog\",\n",
    "    \"horse\",\n",
    "    \"ship\",\n",
    "    \"truck\"\n",
    "]\n",
    "\n",
    "for imgs, labels in train_dataloader:\n",
    "    img = imgs[0]\n",
    "    print(img.shape)\n",
    "    transpose_img = np.transpose(img, (1, 2, 0))\n",
    "    print(transpose_img.shape)\n",
    "    print(f\"label is {cifar_labels[labels[0]]}\")\n",
    "\n",
    "    plt.imshow(transpose_img)\n",
    "    plt.axis(\"off\")\n",
    "    plt.show()\n",
    "\n",
    "    break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "class CNN(nn.Module):\n",
    "    def __init__(self, num_classes):\n",
    "        super().__init__()\n",
    "        self.features = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=3, out_channels=64, kernel_size=5, padding=2),\n",
    "            nn.ReLU(inplace=True),\n",
    "            nn.MaxPool2d(kernel_size=2),\n",
    "            nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=1),\n",
    "            nn.ReLU(inplace=True),\n",
    "            nn.MaxPool2d(kernel_size=2),\n",
    "            nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, padding=1),\n",
    "            nn.ReLU(inplace=True),\n",
    "            nn.MaxPool2d(kernel_size=2),\n",
    "            nn.Conv2d(in_channels=256, out_channels=128, kernel_size=3, padding=1),\n",
    "            nn.ReLU(inplace=True),\n",
    "        )\n",
    "        self.classifier = nn.Linear(in_features=4 * 4 * 128, out_features=num_classes)\n",
    "    \n",
    "    def forward(self, x):\n",
    "        x = self.features(x)\n",
    "        x = x.view(x.size(0), -1)\n",
    "        x = self.classifier(x)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = CNN(10)\n",
    "model.to(device)\n",
    "\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = optim.Adam(model.parameters(), lr=0.001, weight_decay=5e-4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[11], line 14\u001b[0m\n\u001b[1;32m     12\u001b[0m labels \u001b[38;5;241m=\u001b[39m labels\u001b[38;5;241m.\u001b[39mto(device)\n\u001b[1;32m     13\u001b[0m optimizer\u001b[38;5;241m.\u001b[39mzero_grad()\n\u001b[0;32m---> 14\u001b[0m output \u001b[38;5;241m=\u001b[39m \u001b[43mmodel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimgs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     15\u001b[0m loss \u001b[38;5;241m=\u001b[39m criterion(output, labels)\n\u001b[1;32m     16\u001b[0m loss\u001b[38;5;241m.\u001b[39mbackward()\n",
      "File \u001b[0;32m~/Desktop/projects/torch_vgg16_sample/venv/lib/python3.9/site-packages/torch/nn/modules/module.py:1518\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1516\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)  \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[1;32m   1517\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1518\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Desktop/projects/torch_vgg16_sample/venv/lib/python3.9/site-packages/torch/nn/modules/module.py:1527\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1522\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m   1523\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m   1524\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m   1525\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m   1526\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1527\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1529\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m   1530\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n",
      "Cell \u001b[0;32mIn[9], line 55\u001b[0m, in \u001b[0;36mVGG16.forward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m     54\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, x):\n\u001b[0;32m---> 55\u001b[0m     x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfeatures\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     56\u001b[0m     x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mavgpool(x)\n\u001b[1;32m     57\u001b[0m     x \u001b[38;5;241m=\u001b[39m x\u001b[38;5;241m.\u001b[39mview(x\u001b[38;5;241m.\u001b[39msize(\u001b[38;5;241m0\u001b[39m), \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m)\n",
      "File \u001b[0;32m~/Desktop/projects/torch_vgg16_sample/venv/lib/python3.9/site-packages/torch/nn/modules/module.py:1518\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1516\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)  \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[1;32m   1517\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1518\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Desktop/projects/torch_vgg16_sample/venv/lib/python3.9/site-packages/torch/nn/modules/module.py:1527\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1522\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m   1523\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m   1524\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m   1525\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m   1526\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1527\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1529\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m   1530\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n",
      "File \u001b[0;32m~/Desktop/projects/torch_vgg16_sample/venv/lib/python3.9/site-packages/torch/nn/modules/container.py:215\u001b[0m, in \u001b[0;36mSequential.forward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m    213\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m):\n\u001b[1;32m    214\u001b[0m     \u001b[38;5;28;01mfor\u001b[39;00m module \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m:\n\u001b[0;32m--> 215\u001b[0m         \u001b[38;5;28minput\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43mmodule\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m    216\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28minput\u001b[39m\n",
      "File \u001b[0;32m~/Desktop/projects/torch_vgg16_sample/venv/lib/python3.9/site-packages/torch/nn/modules/module.py:1518\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1516\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)  \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[1;32m   1517\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1518\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Desktop/projects/torch_vgg16_sample/venv/lib/python3.9/site-packages/torch/nn/modules/module.py:1527\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1522\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m   1523\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m   1524\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m   1525\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m   1526\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1527\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1529\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m   1530\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n",
      "File \u001b[0;32m~/Desktop/projects/torch_vgg16_sample/venv/lib/python3.9/site-packages/torch/nn/modules/conv.py:460\u001b[0m, in \u001b[0;36mConv2d.forward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m    459\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m: Tensor) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tensor:\n\u001b[0;32m--> 460\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_conv_forward\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbias\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Desktop/projects/torch_vgg16_sample/venv/lib/python3.9/site-packages/torch/nn/modules/conv.py:456\u001b[0m, in \u001b[0;36mConv2d._conv_forward\u001b[0;34m(self, input, weight, bias)\u001b[0m\n\u001b[1;32m    452\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpadding_mode \u001b[38;5;241m!=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mzeros\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m    453\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m F\u001b[38;5;241m.\u001b[39mconv2d(F\u001b[38;5;241m.\u001b[39mpad(\u001b[38;5;28minput\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reversed_padding_repeated_twice, mode\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpadding_mode),\n\u001b[1;32m    454\u001b[0m                     weight, bias, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstride,\n\u001b[1;32m    455\u001b[0m                     _pair(\u001b[38;5;241m0\u001b[39m), \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdilation, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgroups)\n\u001b[0;32m--> 456\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconv2d\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbias\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstride\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    457\u001b[0m \u001b[43m                \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpadding\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdilation\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroups\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "num_epocs = 15\n",
    "losses = []\n",
    "accs = []\n",
    "val_losses = []\n",
    "val_accs = []\n",
    "for epoch in range(num_epocs):\n",
    "    # 学習\n",
    "    running_loss = 0.0\n",
    "    running_acc = 0.0\n",
    "    for imgs, labels in train_dataloader:\n",
    "        imgs = imgs.to(device)\n",
    "        labels = labels.to(device)\n",
    "        optimizer.zero_grad()\n",
    "        output = model(imgs)\n",
    "        loss = criterion(output, labels)\n",
    "        loss.backward()\n",
    "        running_loss += loss.item()\n",
    "        pred = torch.argmax(output, dim=1)\n",
    "        running_acc += torch.mean(pred.eq(labels).float())\n",
    "        optimizer.step()\n",
    "    running_loss /= len(train_dataloader)\n",
    "    running_acc /= len(train_dataloader)\n",
    "    losses.append(running_loss)\n",
    "    accs.append(running_acc)\n",
    "    \n",
    "    # 検証\n",
    "    val_running_loss = 0.0\n",
    "    val_running_acc = 0.0\n",
    "    for val_imgs, val_labels in validation_dataloader:\n",
    "        val_imgs = val_imgs.to(device)\n",
    "        val_labels = val_labels.to(device)\n",
    "        val_output = model(val_imgs)\n",
    "        val_loss = criterion(val_output, val_labels)\n",
    "        val_running_loss += val_loss.item()\n",
    "        val_pred = torch.argmax(val_output, dim=1)\n",
    "        val_running_acc += torch.mean(val_pred.eq(val_labels).float())\n",
    "    val_running_loss /= len(validation_dataloader)\n",
    "    val_running_acc /= len(validation_dataloader)\n",
    "    val_losses.append(val_running_loss)\n",
    "    val_accs.append(val_running_acc)\n",
    "    print(\"epoch: {}, loss: {}, acc: {}    \" \\\n",
    "    \"val_epoch: {}, val_loss: {}, val_acc: {}\".format(epoch, running_loss, running_acc, epoch, val_running_loss, val_running_acc))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fa832f05c00>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABllElEQVR4nO3dd3iVRf7+8fc8OSe9EUhISCgJhF5FsSJgReSnosjavnYsi65rwY5tRcW1rmXdtayisuqiqChiQRQBFZWioZcgkEISIAkJ6c/z++MkByItgSQnyblf18VlTv/MGJKbmXlmjOM4DiIiIiI+Yvm6ABEREfFvCiMiIiLiUwojIiIi4lMKIyIiIuJTCiMiIiLiUwojIiIi4lMKIyIiIuJTCiMiIiLiUwojIiIi4lMKIyIiIuJTLl8XUB87duygsrKyQd8zNjaW3NzcBn3Plsbf+8Df2w/qA7Xfv9sP6oPGar/L5aJNmzYHf16Df3IjqqyspKKiosHezxjjfV9/PaLH3/vA39sP6gO137/bD+qD5tB+TdOIiIiITymMiIiIiE8pjIiIiIhP1TuMrFixgscee4xrr72WcePGsWjRojq/dtWqVVxwwQVMnDixvh8rIiIirVS9F7CWlZXRpUsXTjrpJJ544ok6v664uJgXXniBfv36kZ+fX9+PFRGRBlJWVkZZWZn3dklJCeXl5T6syPf8vQ8Op/1BQUEEBQUd1ufXO4wMGjSIQYMG1fuDXn75ZY4//ngsy+Knn36q9+tFROTwFRcXY4whIiLCexWF2+1u0CsVWyJ/74NDbb/jOJSUlFBcXExYWNghf36TXNo7d+5ctm7dyo033sj7779/0OdXVFTU6hRjDCEhId6vG0rNezXke7Y0/t4H/t5+UB/4W/srKyuJiorydRnSShhjCA0NpaCg4LD+DjV6GMnKymLatGk8+OCDBAQE1Ok1M2bMYPr06d7bycnJTJkyhdjY2EapMT4+vlHetyXx9z7w9/aD+sBf2l9SUoLb7d7r/n3d52/8vQ8Op/1BQUEkJCQc8usbNYzYts0//vEPzj//fDp06FDn140ZM4bRo0d7b9ekrdzc3AbdgdUYQ3x8PNnZ2X650Q2oD/y9/aA+8Lf2l5eX7zUc7+9TFKA+ONz2l5eXk5WVtdf9LperTgMJjRpGSkpKWL9+Penp6bz22muAZ37JcRwuuOAC7r33Xvr27bvX69xu934TWmP8sKipyZ/5ex/4e/tBfeDv7Rc5XIfz96dRw0hISMheV9x88cUXpKWlccsttxAXF9eYHy8iIrKXo48+mquvvprx48f79D1kt3qHkdLSUrKzs723c3Jy2LhxI+Hh4bRr145p06axfft2brjhBizLolOnTrVeHxkZidvt3ut+ERGRfRk7diy9e/fmoYceapD3mzVrFqGhoQ3yXtIw6h1G1q9fz4MPPui9PXXqVACGDRvGhAkT2LFjB3l5eQ1XYSOyv53Ntt/X4px1EUTF+LocERE5RI7jUFVVhct18F9rbdu2bYKKpD7qvQNrnz59eO+99/b6M2HCBAAmTJjAAw88sN/Xjxs3jr///e+HXHBDsr+dza55X+CsWeHrUkREfMJxHJyy0qb/U8f1BX/961/5/vvvefXVV0lMTCQxMZHNmzezcOFCEhMT+frrrxk5ciTJycksWrSIjRs3csUVVzBgwABSU1MZNWoU8+bNq/WeRx99NC+//LL3dmJiIm+99RZXXXUVXbt25fjjj+eLL76oVz9mZGRwxRVXkJqaSo8ePbj22mvJzc31Pr58+XLGjh1L9+7d6dGjByNHjmTZsmUAbNmyhcsuu4zevXvTrVs3RowYwZw5c+r1+S1dk+wz0lyZ7n1wNq3HWZuGOeoEX5cjItL0yssou2Fck3+s9fx7EBR80Oc99NBDbNiwgZ49e3LbbbcBnpGNzZs3A/DII49w33330alTJ6KiosjMzOSkk07ijjvuIDAwkOnTp3PFFVcwb948EhMT9/s5TzzxBPfccw/33nsv//nPf7jhhhv48ccfadOmzUFrtG2bK664grCwMN5//30qKyu55557uP76673bVNx444306dOHxx57DMuyWL58uXcU5+6776aiooL333+f0NBQ1qxZc1gbiLVE/h1GUvvgfPWxRkZERJqpyMhIAgMDCQ4O3udFDxMnTuTEE0/03m7Tpg19+vTx3r799tuZPXs2X3zxBVdcccV+P+eCCy7gnHPOAeDOO+/k1VdfZenSpYwYMeKgNc6fP59Vq1bx/fffewPPs88+y4gRI1i6dCkDBw4kIyOD6667jm7dugGQkpLifX1mZiajRo2iV69eAHTu3Pmgn9na+HcY6V79DZuxEad4JyYswrcFiYg0tcAggv41o+n32Ag8vLNMavTv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zhyKi4vp2bMnV199NQkJCT6sumEdqA8qKyt55513WLJkCTk5OYSGhtKvXz8uuugiYmJifFx5wzjY98Ce/v3vf/PVV19x2WWXceaZZzZ6bX47MrJw4UKmTp3K2LFjmTJlCp07d2by5MkUFBT4urRGt2LFCk4//XQmT57MvffeS1VVFQ8//DClpaW+Lq3JrVu3ji+//JLOnTv7upQmVVRUxKRJk3C5XNx99908/fTTXHrppYSFhfm6tCbx4Ycf8uWXX3LVVVfx9NNPc/HFF/Pxxx/z2Wef+bq0RlNWVkaXLl246qqr9vn4Rx99xGeffcb48eN55JFHCAoKYvLkyZSXlzdxpY3nQH1QXl5Oeno65513HlOmTOHWW28lMzOTxx9/3AeVNo6DfQ/UWLRoEWvXrqVNmzZNVJkfj4x88sknnHzyyYwYMQKA8ePHs3jxYubOncs555zj2+Ia2T333FPr9oQJE7j66qvZsGEDvXv39lFVTa+0tJTnnnuOa6+9lg8++MDX5TSpjz76iLZt2/LnP//Ze19cXJwPK2paa9as4cgjj+SII44APG2fP38+69at83FljWfQoEEMGjRon485jsOsWbM499xzOeqoowC44YYbGD9+PD/99BPHH398U5baaA7UB6GhoUyaNKnWfVdeeSV33303eXl5tGvXrilKbFQHan+N7du389prr3HPPffw2GOPNVFlfjoyUllZyYYNG+jXr5/3Psuy6NevH2vWrPFhZb6xa9cuAMLDw31cSdN65ZVXGDRoEP379/d1KU3u559/JiUlhaeeeoqrr76a22+/na+++srXZTWZ7t27k5aWRmZmJgAbN25k9erVB/1B3Vrl5OSQn59f6+9CaGgo3bp188ufiTV27dqFMYbQ0FBfl9IkbNvmueee46yzzqJjx45N+tl+OTJSWFiIbdtER0fXuj86Otr7w8lf2LbN66+/To8ePejUqZOvy2kyCxYsID09nUcffdTXpfhETk4OX375JWeeeSZjxoxh/fr1/Oc//8HlcjF8+HBfl9fozjnnHEpKSrj55puxLAvbtrngggsYOnSor0vzifz8fACioqJq3R8VFeV9zN+Ul5fz9ttvc/zxx/tNGPnoo48ICAjgjDPOaPLP9sswIru9+uqrbN68mYceesjXpTSZvLw8Xn/9de69914CAwN9XY5P2LZN165dueiiiwBITk5m06ZNfPnll34RRr7//nvmz5/PX/7yFzp27MjGjRt5/fXXadOmjV+0Xw6ssrKSp59+GoCrr77ax9U0jQ0bNjBr1iymTJnik0XcfhlGIiMjsSxrr8Sfn5+/12hJa/bqq6+yePFiHnzwQdq2bevrcprMhg0bKCgo4I477vDeZ9s2K1euZPbs2UybNg3Lat0zmG3atCEpKanWfUlJSfz4448+qqhpvfXWW5x99tnetRCdOnUiNzeXDz/80C/DSM3PvYKCglqLFgsKCujSpYtvivKRmiCSl5fHfffd5zejIitXrqSwsLDWOjLbtpk6dSqzZs3ihRdeaNTP98sw4nK5SElJIS0tzXtZk23bpKWlMXLkSB9X1/gcx+G1115j0aJFPPDAA361cBGgX79+PPHEE7Xu++c//0mHDh04++yzW30QAejRo8deU5KZmZnExsb6qKKmVVZWttf/Z8uy8NejuuLi4oiOjua3337zho9du3axbt06TjvtNN8W14Rqgkh2djb3338/ERERvi6pyZx44om11lECTJ48mRNPPNF7oUdj8sswAjB69GheeOEFUlJS6NatG7NmzaKsrMwv/lX06quvMn/+fG6//XZCQkK8I0ShoaF+MW0REhKy1/qYoKAgIiIi/GbdzJlnnsmkSZP44IMPOO6441i3bh1z5szhmmuu8XVpTWLw4MF88MEHtGvXjqSkJDZu3Mgnn3zSJD90faW0tJTs7Gzv7ZycHDZu3Eh4eDjt2rVj1KhRfPDBByQkJBAXF8c777xDmzZtvFfXtAYH6oPo6Gieeuop0tPTueOOO7Bt2/uzMTw8HJer5f+6PNj3wB/Dl8vlIjo6ukn2oPLrU3tnz57Nxx9/TH5+Pl26dOGKK64gNTXV12U1unHjxu3z/j//+c9+Ecb25YEHHqBLly5+tenZL7/8wrRp08jOziYuLo4zzzyTU045xddlNYmSkhLeffddFi1aREFBATExMRx//PGMHTu2VfzS2Zfly5fz4IMP7nX/sGHDmDBhgnfTs6+++opdu3bRs2dPrrrqqla1GeKB+uD888/nhhtu2Ofr7r//fvr06dPY5TW6g30P/NGECRMYNWpUk2x65tdhRERERHyv9U+Oi4iISLOmMCIiIiI+pTAiIiIiPqUwIiIiIj6lMCIiIiI+pTAiIiIiPqUwIiIiIj6lMCIiIiI+pTAiIiIiPqUwIiIiIj6lMCIiIiI+pTAiIiIiPvX/AftNewZE4yKoAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.style.use('ggplot')\n",
    "plt.plot(losses, label='train loss')\n",
    "plt.plot(val_losses, label='validation loss')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[tensor(0.4989),\n",
       " tensor(0.6753),\n",
       " tensor(0.7396),\n",
       " tensor(0.7731),\n",
       " tensor(0.8028),\n",
       " tensor(0.8237),\n",
       " tensor(0.8427),\n",
       " tensor(0.8609),\n",
       " tensor(0.8743),\n",
       " tensor(0.8835),\n",
       " tensor(0.8939),\n",
       " tensor(0.9002),\n",
       " tensor(0.9070),\n",
       " tensor(0.9129),\n",
       " tensor(0.9184)]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(map(lambda x: x.cpu(), accs))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fa832fcf010>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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dSv3338/q1evpqysjMzMTH7/+99z+umnN/q+B3bTrFmzhttvv52srCwGDRp00KXUPp+P6dOns3z5cnbv3k1SUhJXX3011157LQCPPPIIr7/+euC9AV5//XX69et3UDfN559/zowZM1i3bh2xsbFMnjyZ6dOn43b7v2IXX3wxQ4YMISwsjH//+994PB6uuuoqfve73zXanq+++oqHH36YtWvX4vV6Ofroo7nvvvsYOnRoYJ99+/Yxc+ZM3nvvPYqLi0lNTeWOO+5g7NixAKxcuZJZs2axZs0awsLCOO6443j66acPuUqySFdjbB/8uDkQPshaB1VV9XfyhPrXWElMhtoulYRk/7awrr+EvTirRQNYx40b12i3zH333Vfv8VFHHcVjjz3Wko9pEWMMlb6m93n5sKn2HmJBpGYIC7Ga9FfChAkTuOeee/jss8847bTTANi7dy8ff/wxL7zwAgClpaWceeaZ3H777YSGhjJ37lymTJnCp59+GggGh1JaWsrVV1/N6aefzhNPPMG2bdu499576+1j2zaJiYk888wzREdHs2rVKqZPn07v3r05//zz+Z//+R82btxISUkJjz76KOC/cmrXrvoj4nNycrjqqqu45JJL+Mtf/kJWVha33XYbYWFh9cLG66+/znXXXcf8+fP58ssvufnmmznhhBMaDVglJSVMnjyZGTNmYIzh73//O1dddRXLli2jW7du2LbNlVdeSWlpKU888QQpKSls2LCBkJqluNeuXcull17KpZdeyv3334/b7Wb58uWHvJJLpCswxvjn6vjhG8z3X8OG76C8tP5OMbFYg4/BGnwMvU89kzxC/Mvcizigy61NU+kzXPpaw3OetLXXLh1IuPvw/zPHxsYyevRo3nzzzUAYeeedd4iPj2fkyJEAHH300Rx99NGB10yfPp1Fixbx/vvvM2XKlMN+xrx587Btmz//+c+Eh4czaNAgcnJyuOOOOwL7eDwebr311sDVJP379+fLL79k/vz5nH/++URFRREeHk5VVdUhu2X+9a9/kZSUxMyZM7Esi4yMDHJzc3nooYe4+eabA2d/hgwZwi233AJAeno6s2fPZtmyZY2GkVNPPbXe4z/+8Y8MGTKEzz//nLFjx7J06VK++uorPv74YwYMGABASkpKYP+//vWvHHPMMfzhD38IbBs0aNBhj51IZ2Tycv1nPb6v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36A5K/L9999TVFRUbxyZbdu88MILLFy4kKeeeqpNPz8ow4jb7SY9PZ21a9cGLmuybZu1a9cybtw4h6tre8YYnnvuOVasWMF9990XVAMXAYYOHcqf//znetv++te/kpSUxAUXXNDlgwjAoEGDDuqSzM7OplevXg5V1L4qKysP+u/scrkI1qW6evfuTWxsLN9++20gfJSVlZGVlcXZZ5/tbHHtqDaI5Obmcu+99xIdHe10Se3m9NNPrzeOEmDmzJmcfvrpgQs92lJQhhGACRMm8NRTT5Genk5GRgYLFy6ksrIyKP4qevbZZ1m2bBnTp08nIiIicIYoMjIyKLotIiIiDhofExYWRnR0dNCMmznvvPO45557+M9//sOIESPIyspi8eLFXHfddU6X1i6GDx/Of/7zH3r27ElycjJbt25lwYIF7fJD1ykVFRXk5uYGHu/evZutW7fSrVs3evbsybnnnst//vMfEhMT6d27N6+++ipxcXGBq2u6gkMdg9jYWB599FG2bNnC7bffjm3bgZ+N3bp1w+3u/L8uD/cdODB8ud1uYmNj22UOqqBetXfRokW8/fbbFBYWkpqaypQpU8jMzHS6rDZ3ySWXNLj9+uuvD4ow1pD77ruP1NTUoJr07Msvv+SVV14hNzeX3r17c95553HWWWc5XVa7KC8v57XXXmPFihXs27eP+Ph4Ro4cycUXX9wlfuk05LvvvuP+++8/aPsZZ5zBDTfcEJj07MMPP6SsrIzBgwfzy1/+sktNhnioYzB58mRuvPHGBl937733cvTRR7d1eW3ucN+BA91www2ce+657TLpWVCHEREREXFe1+8cFxERkQ5NYUREREQcpTAiIiIijlIYEREREUcpjIiIiIijFEZERETEUQojIiIi4iiFEREREXGUwoiIiIg4SmFEREREHKUwIiIiIo5SGBERERFH/X+kTjHppdJplAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.style.use('ggplot')\n",
    "plt.plot(list(map(lambda x: x.cpu(), accs)) if device == \"cuda\" else accs, label='train acc')\n",
    "plt.plot(list(map(lambda x: x.cpu(), val_accs)) if device == \"cuda\" else val_accs, label='validation acc')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "val_transform = transforms.Compose([\n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize((0.5, ), (0.5,))\n",
    "])\n",
    "\n",
    "\n",
    "train_transform = transforms.Compose([\n",
    "    transforms.RandomHorizontalFlip(),\n",
    "    transforms.ColorJitter(),\n",
    "    transforms.RandomRotation(10),                                \n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize((0.5, ), (0.5,))\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n"
     ]
    }
   ],
   "source": [
    "train_dataset = datasets.CIFAR10(root=\"./data\", train=True, download=True, transform=train_transform)\n",
    "validation_dataset = datasets.CIFAR10(root=\"./data\", train=False, download=True, transform=val_transform)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_dataloader = DataLoader(train_dataset, batch_size=32, shuffle=True)\n",
    "validation_dataloader = DataLoader(validation_dataset, batch_size=32, shuffle=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = CNN(10)\n",
    "model.to(device)\n",
    "\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = optim.Adam(model.parameters(), lr=0.001, weight_decay=5e-4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 0, loss: 1.4435760264433277, acc: 0.47590771317481995    val_epoch: 0, val_loss: 1.1346955375549512, val_acc: 0.6019368767738342\n",
      "epoch: 1, loss: 1.0310561080163516, acc: 0.6362364292144775    val_epoch: 1, val_loss: 0.8821106712086894, val_acc: 0.6911940574645996\n",
      "epoch: 2, loss: 0.8719073764155175, acc: 0.6935181021690369    val_epoch: 2, val_loss: 0.7989332152250856, val_acc: 0.7202475666999817\n",
      "epoch: 3, loss: 0.7900122794979898, acc: 0.7243682146072388    val_epoch: 3, val_loss: 0.7352881567737165, val_acc: 0.7429113388061523\n",
      "epoch: 4, loss: 0.7362692007557826, acc: 0.7435020804405212    val_epoch: 4, val_loss: 0.7352520952019067, val_acc: 0.7447084784507751\n",
      "epoch: 5, loss: 0.6932785104595539, acc: 0.7586172223091125    val_epoch: 5, val_loss: 0.7395857889145708, val_acc: 0.7540934085845947\n",
      "epoch: 6, loss: 0.6568636212567069, acc: 0.7705734372138977    val_epoch: 6, val_loss: 0.7025497612385704, val_acc: 0.754792332649231\n",
      "epoch: 7, loss: 0.6377605633978194, acc: 0.779150664806366    val_epoch: 7, val_loss: 0.714358494875911, val_acc: 0.753494381904602\n",
      "epoch: 8, loss: 0.6178569235694157, acc: 0.7852087616920471    val_epoch: 8, val_loss: 0.6743191906248038, val_acc: 0.7697683572769165\n",
      "epoch: 9, loss: 0.6018750546398791, acc: 0.7899872064590454    val_epoch: 9, val_loss: 0.61924978966911, val_acc: 0.7884384989738464\n",
      "epoch: 10, loss: 0.5840353119453404, acc: 0.796265184879303    val_epoch: 10, val_loss: 0.6307958862461602, val_acc: 0.7867411971092224\n",
      "epoch: 11, loss: 0.5716534089142133, acc: 0.7998640537261963    val_epoch: 11, val_loss: 0.612235576533281, val_acc: 0.7898362278938293\n",
      "epoch: 12, loss: 0.5610487005284255, acc: 0.8061420321464539    val_epoch: 12, val_loss: 0.6044578283739547, val_acc: 0.792132556438446\n",
      "epoch: 13, loss: 0.5532127348604831, acc: 0.8068618178367615    val_epoch: 13, val_loss: 0.6293040259768026, val_acc: 0.7891373634338379\n",
      "epoch: 14, loss: 0.5471331213463291, acc: 0.809281051158905    val_epoch: 14, val_loss: 0.614819911103279, val_acc: 0.7936301827430725\n"
     ]
    }
   ],
   "source": [
    "num_epocs = 15\n",
    "losses = []\n",
    "accs = []\n",
    "val_losses = []\n",
    "val_accs = []\n",
    "for epoch in range(num_epocs):\n",
    "    # 学習\n",
    "    running_loss = 0.0\n",
    "    running_acc = 0.0\n",
    "    for imgs, labels in train_dataloader:\n",
    "        imgs = imgs.to(device)\n",
    "        labels = labels.to(device)\n",
    "        optimizer.zero_grad()\n",
    "        output = model(imgs)\n",
    "        loss = criterion(output, labels)\n",
    "        loss.backward()\n",
    "        running_loss += loss.item()\n",
    "        pred = torch.argmax(output, dim=1)\n",
    "        running_acc += torch.mean(pred.eq(labels).float())\n",
    "        optimizer.step()\n",
    "    running_loss /= len(train_dataloader)\n",
    "    running_acc /= len(train_dataloader)\n",
    "    losses.append(running_loss)\n",
    "    accs.append(running_acc)\n",
    "    \n",
    "    # 検証\n",
    "    val_running_loss = 0.0\n",
    "    val_running_acc = 0.0\n",
    "    for val_imgs, val_labels in validation_dataloader:\n",
    "        val_imgs = val_imgs.to(device)\n",
    "        val_labels = val_labels.to(device)\n",
    "        val_output = model(val_imgs)\n",
    "        val_loss = criterion(val_output, val_labels)\n",
    "        val_running_loss += val_loss.item()\n",
    "        val_pred = torch.argmax(val_output, dim=1)\n",
    "        val_running_acc += torch.mean(val_pred.eq(val_labels).float())\n",
    "    val_running_loss /= len(validation_dataloader)\n",
    "    val_running_acc /= len(validation_dataloader)\n",
    "    val_losses.append(val_running_loss)\n",
    "    val_accs.append(val_running_acc)\n",
    "    print(\"epoch: {}, loss: {}, acc: {}    \" \\\n",
    "    \"val_epoch: {}, val_loss: {}, val_acc: {}\".format(epoch, running_loss, running_acc, epoch, val_running_loss, val_running_acc))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fa7e04a3910>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABe4ElEQVR4nO3dd3yV1eHH8c+5I3uThISEkAABlLLEjSi4GVVx1WqrxV1H7VBb96hYtVrbn9raVltrrVWL4EREcTIURFABMQQSICQhe+/c5/fHTS4EAiTk3twk9/t+vfJK7nrOyE3yzTnnOY+xLMtCRERExE9s/q6AiIiIBDaFEREREfErhRERERHxK4URERER8SuFEREREfErhRERERHxK4URERER8SuFEREREfErhRERERHxK4URERER8SuHvyvQHeXl5bS0tHj1mAkJCRQXF3v1mP1NoPdBoLcf1Adqf2C3H9QHvmq/w+EgNjb24M/zesk+1NLSQnNzs9eOZ4zxHDdQL9ET6H0Q6O0H9YHaH9jtB/VBX2i/pmlERETErxRGRERExK8URkRERMSvFEZERETEr/rVAlYREem5xsZGGhsbPbfr6+tpamryY438L9D7oCftDw4OJjg4uEflK4yIiASQ2tpajDFERkZ6zqJwOp1ePVOxPwr0PjjU9luWRX19PbW1tYSHhx9y+ZqmEREJIC0tLYSFhXmCiEhPGGMICwvr8R5gCiMiIgFEIUR8oafvK4URERER8SuFEREREfErhREREQkoxxxzDH//+9/9fgzZTWfTiIhIn3b++edz+OGHc//993vleIsWLSIsLMwrxxLvCOgw4vroHUp35mCdeT7EJfi7OiIicogsy6K1tRWH4+B/1gYNGtQLNZLuCOhpGtenS6j78B2srd/5uyoiIn5hWRZWY0Pvf3Tx6rA///nPWblyJc8++ywpKSmkpKSwY8cOVqxYQUpKCh988AFnnnkmGRkZrFq1itzcXObOncuECRPIzMxk5syZfPLJJx2OufcUS0pKCi+88AJXXHEFI0aMYMqUKSxZsqRb/bhz507mzp1LZmYmo0eP5pprrqG4uNjz+IYNGzj//PMZNWoUo0eP5swzz+Srr74CIC8vj8suu4zDDz+ckSNHMn36dJYuXdqt8vu7gB4ZMRmZWNuysXI3Y448wd/VERHpfU2NNN5wYa8Xa3vy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Yq+UY7fbe60sf+vJz49P9xkJDQ3l0Ucf5ZFHHvF8nHbaaQwZMoRHHnmkz12V0KS766P9RkRE+oYXXniBI444Yp8r786dO5df/vKXAOTm5jJ37lwmTJhAZmYmM2fO5JNPPjngcVNSUli8eLHn9pdffsnpp5/O8OHDmTFjBuvXr+/w/NbWVn71q19x7LHHMmLECKZOncozzzzjefyxxx7jf//7H++++y4pKSmkpKSwYsUKduzYQUpKSofjrVy5klmzZpGRkcGkSZN48MEHO4z6n3/++dx111088MADjB07lokTJ/LYY491q98aGxu56667GD9+PMOHD+ecc85h3bp1nscrKiq44YYbGDduHCNGjOCYY47h5ZdfBtyjHHfccQeTJk1i+PDhHH300TzxxBPdKr+7uj0y0tDQQGFhoed2UVERubm5REREEB8fz4svvkhZWRk33HADNpuNtLS0Dq+PiorC6XTuc3+fkJ4JKz/UFXxFJGBYlkVDs4vmFtfBn+xFwXbTpQWPs2fP5q677mL58uVMnToVgPLycj766CPP+oja2lpOPvlkfv3rXxMUFMT8+fOZO3cun3zyCSkpKQcto7a2lh/96EdMnTqVJ554gu3bt3PPPfd0eI7L5SI5OZm//vWvxMbG8sUXX3DrrbeSmJjIWWedxbXXXsvmzZupqanhD3/4AwAxMTHs2rWrw3EKCgr48Y9/zIUXXsif/vQnsrOzueWWWwgODvZcxRfgf//7H1dffTVvvvkma9as4Re/+AVHHXUUJ5544kHbAzBv3jwWLVrEH//4R1JTU/nzn//MJZdcwrJly4iNjeX3v/89WVlZvPDCC8TFxbFjxw5qamoA+Mc//sGSJUt4+umnSUlJIT8/n/z8/C6Ve6i6HUa2bNnCfffd57nd/mY46aSTuP766ykvL6ekpMR7NexFJmMUFkDuZizL0up6ERnwGlstfvDyhl4v9+UfjCLEcfDfsTExMUyfPp3XXnvNE0befvtt4uLimDJlCgBjx45l7NixntfceuutLF68mCVLljB37tyDlrFw4UJcLhePPvooISEhjB49moKCAm677TbPc5xOJzfffLPndlpaGmvWrOHNN9/krLPOIjw8nJCQEJqamg44LfOvf/2LIUOGMG/ePIwxjBw5ksLCQh588EF+8YtfYLO5JywOO+wwz8jP8OHDee6551i2bFmXwkhdXR3PP/88jz/+OCeffDIAv//97zn22GN56aWX+OlPf8rOnTv53ve+x4QJEzxltK8Z2blzJxkZGRx99NEYY0hNTT1omT3V7TAyduxYXnnllf0+fv311x/w9RdeeCEXXnhhd4vtHakZYHdATRWUFkH8YH/XSEQk4M2ZM4dbb72VBx98kODgYBYuXMhZZ53l+cNdW1vLY489xtKlSykqKqKlpYWGhgZ27tzZpeNv3ryZww8/nJCQEM99kydP3ud5zz33HC+99BI7d+6koaGB5ubmDiGoK7Kzs5k8eXKHf3aPOuooamtrKSgo8IzkHHbYYR1el5iY2OV/9HNzc2lubuaoo3avfXQ6nUycOJHNm90j/5deeilXXXUV33zzDSeddBKzZs3y7CF24YUXctFFFzF16lSmT5/OqaeeykknndStdnZXr+wz0l8YpxNS02FbNlbOZozCiIgMcMF2w4JLxtLc0rtn0wTbuz7yfNppp2FZFkuXLmXChAl8/vnn3HvvvZ7H77//fj799FPuuusu0tPTCQkJ4eqrr6apqclr9X399df57W9/y1133cWRRx5JeHg4f/nLX1i7dq3XytiTw9Hxz7MxZp91Mz1x8skns2rVKpYuXcqnn37K+eefz2WXXcbdd9/NuHHj+Oyzz/jggw9YtmwZ1157LSeccAJ///vfvVb+3hRG9mIyMrG2ZUPuZjjqBH9XR0TEp4wxhDht2PvwdVNDQkKYMWMGCxcuJDc3lxEjRnTYs+OLL77gggsuYMaMGYB7pCQvL6/Lx8/MzGTBggU0NDR4Rke+/PLLDs9ZvXo1kydP5ic/+Ynnvm3btnV4TlBQEK2trQcsa+TIkSxatKjDUoDVq1cTERHhtT2u0tPTCQoKYvXq1Z4plubmZtatW8dVV13led6gQYM8sxXHHXcc9913H3fffTcAkZGRnH322Zx99tnMmjWLSy65hPLycmJjY71Sx7313Xefv+gKviIifc6cOXNYunQpL730EnPmzOnwWEZGBu+88w7r169nw4YNXH/99d0aRZgzZw7GGG655RaysrJYunQpTz/99D5lfP3113z00Uds2bKFRx55hK+++qrDc1JTU/n222/Jzs6mrKys0307LrvsMvLz87nzzjvJzs7m3Xff5bHHHuPqq6/2TDv1VFhYGD/+8Y954IEH+PDDD8nKyuKWW26h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h/ujo6M9jwWapqYm/vOf/zBlypSACSOvv/46drudGTNm9HrZARlGZLdnn32WHTt2cP/99/u7Kr2mpKSE5557jjvvvJOgoCB/V8cvXC4XI0aM4OKLLwYgIyOD7du389577wVEGFm5ciXLli3jZz/7GUOHDiU3N5fnnnuO2NjYgGi/HFhLSwuPP/44AFdeeaWfa9M7tm7dyqJFi3j44Yf9sog7IMNIVFQUNpttn8RfUVGxz2jJQPbss8/y5Zdfct999zFo0CB/V6fXbN26lcrKSn7961977nO5XHz77bcsXryYF198EZttYM9gxsbGkpqa2uG+1NRUPv/8cz/VqHe98MILnH322Z61EGlpaRQXF/Paa68FZBhp/71XWVnZYdFiZWUl6enp/qmUn7QHkZKSEu6+++6AGRX59ttvqaqq6rCOzOVy8fzzz7No0SKeeuopn5YfkGHE4XAwfPhw1q9f7zmtyeVysX79es4880w/1873LMviH//4B6tWreLee+8NqIWLAOPGjePRRx/tcN9f/vIXhgwZwtlnnz3ggwjA6NGj95mSzM/PJyEhwU816l2NjY37fJ9tNhuBeqmuxMREYmJi+Oabbzzho66ujuzsbE4//XT/Vq4XtQeRwsJC7rnnHiIjI/1dpV5z4okndlhHCTBv3jxOPPFEz4kevhSQYQRg9uzZPPXUUwwfPpyRI0eyaNEiGhsbA+K/omeffZZly5Zx6623Ehoa6hkhCgsLC4hpi9DQ0H3WxwQHBxMZGRkw62ZmzZrFXXfdxYIFCzj++OPJzs5m6dKlXH311f6uWq+YPHkyCxYsID4+ntTUVHJzc3nrrbd65ZeuvzQ0NFBYWOi5XVRURG5uLhEREcTHxzNz5kwWLFhAcnIyiYmJvPTSS8TGxnrOrhkIDtQHMTEx/OEPfyAnJ4df//rXuFwuz+/GiIgIHI7+/+fyYO+BvcOXw+EgJiamV/agCuir9i5evJg33niDiooK0tPTmTt3LpmZmf6uls9deOGFnd5/3XXXBUQY68y9995Lenp6QG16tmbNGl588UUKCwtJTExk1qxZnHrqqf6uVq+or6/n5ZdfZtWqVVRWVhIXF8eUKVM4//zzB8Qfnc5s2LCB++67b5/7TzrpJK6//nrPpmfvv/8+dXV1jBkzhiuuuGJAbYZ4oD644IILuOGGGzp93T333MPYsWN9XT2fO9h7YG/XX389M2fO7JVNzwI6jIiIiIj/DfzJcREREenTFEZERETErxRGRERExK8URkRERMSvFEZERETErxRGRERExK8URkRERMSvFEZERETErxRGRERExK8URkRERMSvFEZERETErxRGRERExK/+H7S5ZCoX/gnKAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.style.use('ggplot')\n",
    "plt.plot(losses, label='train loss')\n",
    "plt.plot(val_losses, label='validation loss')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fa805ccfb80>"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGdCAYAAAAxCSikAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABfTklEQVR4nO3deXxU1cH/8c+dzGRPSAIJSSBkIUFQwQURBReQqqhUwaUqrY9KQR+X9qm2akWtuOBT2krtU7U/W7GWWhdEqSBIqyBWxAUEl4iK7EsSSCCTfZu59/fHJJMEAiRhtmS+79eLV2buzNx7znEkX8459xzDsiwLERERkRBmC3YBRERERI5GgUVERERCngKLiIiIhDwFFhEREQl5CiwiIiIS8hRYREREJOQpsIiIiEjIU2ARERGRkKfAIiIiIiFPgUVERERCnj3YBfCl8vJyXC6Xz8+bmppKaWmpz8/bU4R7/UFtEO71B7VBuNcf1Ab+qL/dbic5Oblz7/XplYPM5XLR1NTk03MahuE9dzhuuxTu9Qe1QbjXH9QG4V5/UBuEQv01JCQiIiIhT4FFREREQp4Ci4iIiIQ8BRYREREJeb1q0u2RNDQ00NDQ0K3P1tXV0djY6OMS9RzhXn+A+vp6GhsbiY+P904+ExGRwAmLwFJTU4NhGCQkJHTrl43D4fD53Uc9SbjXHzxtUFNTQ3V1NQkJCcEujohI2AmLISGXy0VsbKz+ZSzHJDIyMixvZxQRCQVhEVgUVERERHq2sAgsIiIi0rMpsIiIiEjIU2AJI6NHj+Yvf/lLsIshIiLSZWFxl1BPdeWVV3L88cfz8MMP++R8y5YtIzY21ifnEhERCSQFlh7Osizcbjd2+9H/U/bt2zcAJRIRkZ7Icruhpsrzp7oKqiuxqis9j2uqKI+JhknXBq18YRlYLMuCxs4vImeZbixfrUMSGdWpu5Z+9rOf8eGHH/Lhhx8yb948AD766CN27drFVVddxd///nd+85vf8M033/Diiy+SmZnJQw89xPr166mtraWgoIBf/vKXnHPOOd5zjh49munTpzNjxgwABgwYwG9/+1tWrFjBqlWrSE9P58EHH+SCCy44bLkWLlzIvHnz2LJlC7GxsYwdO5aHHnqIfv36ed/z7bffMnv2bD7++GMsy+KEE07g97//PTk5OQC8/PLLPPPMM2zfvp2kpCQuvvhiZs+e3Z3WFBGRDlhNTVDTGjY84cPz03OszfPm16mtOeI5q+0OIi65JkA1OFRYBhYaGzBv/0Gn39699XE7ZntyAURFH/V9Dz/8MFu3bmXo0KH84he/ADw9JLt27QLgscce41e/+hWDBg2iT58+FBUVcd5553HPPfcQGRnJwoULufHGG/nPf/7DgAEDDnuduXPncv/993P//ffz17/+ldtvv52PP/6Y5OTkDt/vcrm46667GDx4MGVlZTz00EPccccd/P3vfweguLiYyy+/nDFjxrBgwQLi4+NZt24dLpcLgL/97W88/PDD3HvvvYwfP56qqirWrl3bpTYUEenNLNMNLhe4W342QVMT1NVAdZWn16OmCqoqvb0hVtvgUV0FDXXdL0BsHMQnQlwCxCdixHt+JmYMoNoywQjO9NfwDCw9QGJiIpGRkURHR5OWlnbI63fddVe73pPk5GROOOEE7/O7776b5cuX8+9//5sbb7zxsNf5wQ9+wOTJkwH45S9/ybx58/jss88YP358h++/5prWdJ2dnc0jjzzCxRdfTE1NDXFxcTz//PMkJiby9NNP43A4ABg8eLD3M//3f//HTTfdxPTp073HTj755CM3hohIkFgNDbB7G1bxLqpiojEPHMByNXmChMsF7uY/rvY/Le/zpjbBo/l5Sxjxvr/Ne1wusEzfFN6wQVy8J3w0hw4jLsH7mLgEjPjEdq8TG48REXHoqQyDxIwMaoqLg7aAZngGlsgoT09HJ/l0afrIKJ+cZsSIEe2e19TU8Pjjj7NixQr27duHy+Wivr6ePXv2HPE8w4YN8z6OjY0lISGBsrKyw77/iy++4PHHH2fjxo1UVFRgmp7/sfbs2cOQIUPYuHEjp59+ujestFVWVkZJSQlnnXVWV6oqIhIQVn0t7NyKtXML7Gj+WbzbGyCcwSqYzQZ2O8R00PPR/Jj4BIy4NsEjPhFiYjFsvedm4LAMLIZhdGpYxvt+hwPDdmjiDKaD7/Z5+OGHef/993nggQfIyckhOjqam2666aibFh4cLAzD8IaQg9XW1jJ16lTGjRvHk08+Sd++fdmzZw9Tp071Xic6+vDteqTXREQCyaqphp1bmsPJFqydW2HvYf6B1ycFY2AO0Sl9qW9qggi7J0B05mfzY8NuhwgHRER4XuvC894UOo5FWAaWnsLhcBw2PBxs3bp1XHXVVVx00UWAp8dl9+7dPi3P5s2bKS8v59577/XOi/n888/bvWfYsGG8+uqrNDU1HRKG4uPjycrKYvXq1YwdO9anZRMRORyrqqI5lGzB2rEFdm6Bsr0dvzmlHwzKx8jOwxg0GAYNxkhKwTAM+mVkUBzEIZFw163Asnz5cpYsWYLT6SQ7O5tp06aRn59/2PcvXbqUf//735SVlZGYmMjo0aOZOnUqkZGR3T5nOMjKymLDhg3s2rWLuLg4kpKSDvve3Nxc3nrrLc4//3wMw+C3v/1tp8NOZw0YMIDIyEj++te/ct111/Htt9/yxBNPtHvPDTfcwHPPPcett97K7bffTkJCAuvXr+fkk08mPz+fO++8k3vvvZd+/foxfvx4ampqWLt2LdOmTfNpWUUkPFnOA63hZGdzODlwmGHu1HQY5AkmRna+53FCn8AWWDqty4FlzZo1zJ8/nxkzZlBQUMDSpUuZPXs2TzzxBH36HPofevXq1bz44ovccsstDBkyhOLiYp5++mkMw+D666/v1jnDxc0338zPfvYzxo0bR319PR999NFh3/vggw9y5513ctlll5GSksJtt91GdXW1T8vTt29ffv/73/PrX/+a5557jhNPPJEHHnig3aTelJQUFixYwKOPPsoVV1xBREQEJ5xwAqNGjQI8k3wbGhr4y1/+wiOPPEJKSgqXXHKJT8spIr2fZVmeILJzC9aOzZ4hnZ1boKK84w/0H4CR3dxjMijP8zMuPrCFlmNiWF3s25o5cyaDBw/mxz/+MQCmaXLLLbdw0UUXee82aWvevHns2bOHX/3qV95j8+fP57vvvuORRx7p1jkPp7S0tMPJsZWVlSQmJnahlu35dNJtDxTu9YfWNjjW71JPZBgGGWHeFR7ubRDs+lumG8r2eeecWDuaw0l1ZQeFtUHGQM9wTnYexqB8yMrFiDm2Vb6D3QbB5q/6OxwOUlNTO/XeLvWwuFwutm7d2i5E2Gw2hg8fzqZNmzr8zHHHHcf777/P5s2byc/PZ+/evWzYsIGzzz672+dsampq9wvUMAxiYmK8j0X8Kdy+Yy31Dbd6txXubeDP+lumCVUVcKAUq3x/888yOFCGdaAMykvBeQA6GuKOiIDMQRjZ+c3DOoNhYA5GF26q6Cx9B4Jf/y4FlsrKSkzTPGQuRVJSEkVFRR1+5qyzzqKyspIHHngAALfbzfnnn8/ll1/e7XMuWrSIhQsXep/n5uYyZ86cw6a0urq6Dm+z7Ypj/XxPF+71B08bREZGkpGREeyiBEV6enqwixB04d4GXa2/ZVmYlRW4y0pwl+7FVbYXd9k+3KV7cZftxVW6F/f+fZ61SY7G7sCRW0Dk4OOIzB9KZP4wHNmDMXy0VERn6TsQvPr7/S6hr776ikWLFjF9+nQKCgooKSnhr3/9KwsXLuTKK6/s1jmnTJnCpEmTvM9bEl9paal3RdW2Ghsbj2lII9yHRMK9/tDaBo2NjRQXFwe7OAFlGAbp6emUlJSEZVc4qA06qr9lWZ6VV9v0hFgHPD0jlJd5eknKy+AoSys0XwD6JENKKkZyX0juh5GSCin9MJL7QXI/SErGskXQQJvVx/cf8FeVOyiivgP+qL/dbvfPkFBiYiI2mw2n09nuuNPpPOwdLK+88grnnHMOEyZMAGDQoEHU19fz5z//mcsvv7xb53Q4HIf9F384fpEksML1O2ZZVtjWvUW4tYFlmrCvCHZuoaKmEtfO7VgHSr2hhIb6zp0ooQ+kpDYHkX6eW4eT+npDCX1SPOuUHK08IdD24fYdOFgw69+lwGK328nLy6OwsJDTTz8d8EyQLSwsZOLEiR1+pqGh4ZAxL1ubRXC6c04REfEty+2Gkt3edUqsHVtg1zbvnjQdTG/1iE/w9ICkpDb3hvRt7hlJbQ0mGlIWH+jykNCkSZN46qmnyMvLIz8/n2XLltHQ0MC4ceMAePLJJ0lJSWHq1KkAjBw5kqVLl5Kbm+sdEnrllVcYOXKkN7gc7ZwiIuI7lqsJinZh7djcuhT97m0dD99ERkJWHnH5w6iLicNK7ts6TJPcDyMqsHNIJHx1ObCMGTOGyspKFixYgNPpJCcnh5kzZ3qHb8rKytr1qFxxxRUYhsHLL7/MgQMHSExMZOTIkVx77bWdPqeIiHSP1dQIu3c0L0HfvF7Jnu2eTfYOFh3jXUiN7MGen+kDsEXYSQnjW3rDTb3LpKSqkeKqJoqrGimu9jw2Iop49LzMoJWry+uwhDKtw+If4V5/0Dos4bz+BPScNrAa6mH39uaek+b1Sop3enYCPlhsHGTnty6iNmgwpGV0uG9NT6m/L5mWRU2jSXWjm6oGN3Uui9wB/XFVl9MnKoIIW8++vbmm0U1JdXMgaRdOmiiv6yDMAjYDXr3mOOw+rLvf1mGRnmf06NFMnz6dGTNmAJ7l9efNm3fY+UG7du3ijDPO4F//+hcnnnhit6/rq/OISMesulrYtbV1874dW6Bkj3dn4XbiE709Ji1L0NOvf1isKWJaFrVNJtUNbqqaw0dVg5vqRtP7vO1r1Y2trx8azXYCYACJUREkxdhJjm75aSc5xk5SdITnZ/Ox+Ehb0Nq5qsHdGki84aSJkqpGKho6CLFtJERFkBHvICMhkowEBxkJUQzPzcBm1QSo9IdSYAkzGzZs8Pl2Bz/72c+orKzkueee8x7LzMxkw4YNpKSk+PRaIuHIqq6EXds6vbNwazjx9J6Q3K/HhxPLsqhzmc2BwzwkYLQPH6b3tepGN+YxdArF2G0kRNmItkdQ67I4UNuIaUFFg5uKBjc7jvJ5uw2SvGHGTnJMhPd5crSdpJgIb9iJsndtV2bLsqjwhhJPICmpamoewmmkuvHI+8klRUe0BpL4SNLbPI6Pimj3Xk8vWx+Ki2t7xl1C0vOlpaUF5DoREREBu5ZIb2A1NsC+YthbhFWy2/NzX5EnmFRXdfyhlFTPcE52nqfnJCsPI6ln/SOhyW1SXuemvN5FeZ3nz4G61sfl9W7K61xU1LtwH8PvyWi7QXxkBAlRESRERhDf/DMhKoKEKNshryVGRhAXGYEjonWF14yMDHbvKaKywYWzTdk8j10429TDWe+iutHEZUJZrYuy2o6HWdqKsdvaBZqWHpzkGDuJURFUNrhbh26aQ0qd68ihpG+MnYwER3MYaRtOHMQ6Io742VCjwBKiXnjhBebOncu6deva3QZ+4403kpyczNy5c9m+fTsPPfQQ69evp7a2loKCAn75y19yzjnnHPa8Bw8JbdiwgXvuuYfNmzdz3HHH8dOf/rTd+91uN3fddRfvv/8+paWlZGZmcv311zN9+nQAHn/8cV599VXvuQFeffVVsrKyDhkS+vDDD3n00UfZuHEjSUlJXHXVVdx9993Ym9dfuPLKKxk2bBhRUVG89NJLOBwOrrvuOn7+858ftj6fffYZv/71ryksLMTlcnHCCScwa9Yshg8f7n1PRUUFs2fP5l//+hdVVVXk5ORw7733cv755wOwdu1a5syZw4YNG4iKiuLkk0/m6aef1qRv8TnLdMP+Uti7B2tvUevPkj2edU06+Jdrg83BOwPGUJ6UQUxiPLHJycT260dM//7EJsYT67ARY7cR4/D8ibYsbEHuTWnpDWkNHu7WAFLn4kB98y/5OhdVR+kFOFhkhNFB6LAdGkKaf3qO2XBEdK334nAibAZJ0Z7ekpyjvLfJbeJsDjVtA01LwCmvc+NsDjiNbk+b1VWZFFV1fs6gAaTG2T2BJL5l+MYTTtLjHV3utQllYRlYLMuioQtR3Y1J01FSbGdFRRid6pqdNGkSDzzwAB988IF336Xy8nJWrVrF/PnzAaipqeG8887jnnvuITIykoULF3LjjTfyn//8xxsejqSmpobrr7+ec845hz/+8Y/s3LmTBx98sN17TNMkIyODZ555huTkZNatW8fdd99NWloal156Kf/93//Nd999R3V1NXPnzgU82yrs3bu33XmKi4u57rrr+MEPfsAf/vAHNm/ezF133UVUVFS7QPLqq69y0003sWTJEj799FPuuOMORo0addgQVl1dzVVXXcWjjz6KZVk888wzXHfddaxevZr4+HhM0+RHP/oRNTU1/PGPfyQ7O5tNmzYREeH5l0VhYSFXX301V199NQ899BB2u501a9ZgdrRviUgnWJbl2RtnbxHW3j3NPSZ7PD0lpcUd353TIjbOs6tw+gCstAF8FJfDX/cnUtrQ5j21eKZS7CwHDt2Z2ABPeGkTYmKb/3ieRxBjP/iYrflYhPdYrMNG5EF/X5mWRUWbnpCWMHLgkGOuLv0da7cZpLTpWUiJaR4yaTs3JMYTQnrSL2BHhI3UOBupcUdeh6Yl4JXXuduEGZc37DjrPY/bzivJbO4tSYt3EOmjMBbqwjKwNLgtrn6l440V/e2Vq4cQbT96YElKSmL8+PH885//9AaWpUuXkpKSwtixYwE44YQTOOGEE7yfufvuu1m+fDn//ve/ufHGG496jUWLFmGaJr/73e+Ijo7muOOOo7i4mHvvvdf7HofDwT333OO9S2jQoEF8+umnLFmyhEsvvZS4uDiio6NpbGw84hDQ3/72NzIzM5k9ezaGYZCfn09JSQmPPfYYd9xxh7cXadiwYdx5550A5OXl8fzzz7N69erDBpazzjqr3fPf/OY3DBs2jA8//JDzzz+f999/n88++4xVq1YxePBgALKzs73v/9Of/sSIESP43//9X++x44477qhtJ2I11DeHkiLYu7vN4z1Qe4SJiXYHpGVA+gCM/pmegNJ/APQfAPEJGIbB9vJ6/vLpPgqLagHoF2tndFYCDS6T2iaTuibPz/omk9omN7UuzzHTAguobX6dumOro81oDT8221b21zR0aVgm1mFrDh0RrQGkOZAkRbcGk2BOTA0FhmE0h8UIBiRGBrs4ISssA0tPMWXKFO6++24ee+wxoqKiWLRoEZdeeqn3l3tNTQ2PP/44K1asYN++fbhcLurr69mz5zCT8Q7y3XffMWzYMKKjW3c2HTly5CHvmzdvHi+++CJ79uyhvr6epqamdkGpMzZv3szIkSPb/aU0atQoampqKC4u9vYIDRs2rN3n0tLSKCsrO+x5S0tL+c1vfsOaNWvYv38/breburo6bxt89dVXZGRkeMPKwb766qt2+1KJtGVZFlQcwNq9naqPKnF/942314Tyw38vMQzP/JL+bUJJ+gDon+lZBdbW8dyBqgY3L35RyvLvnJiWZ/jj8uNTuPz4vkftWbAsyzOs0BxW6lzNYaY54NS1CTotAaeuyX3Q+1vfZwGmBTWNJjWNJuDpGTKAxOgIT9iI9syz8AQPTyhJaXOsJ/WGSOgLy8ASFWHwytVDOv1+h91BU2d2E+3ktTvr/PPPx7IsVqxYwUknncTHH3/MrFmzvK8//PDDvP/++zzwwAPk5OQQHR3NTTfdRGNnNhvrpDfeeIOHHnqIBx54gNNOO424uDj+9Kc/sWHDBp9doy37QfuJGIZxxOGZn/3sZ5SXl/Pwww8zcOBAIiMjufTSS709Qm3DWEeO9rqED8t0w75izx04u7Y1/9zqGd4BnB19KD4R+mc295BkNoeSAZCa3qVdhN2mxb83O/nH56XeOR1nZiVw46mp9I/v3L+4DcMgym4QZbeRFNPpS3fIsizqXZY39NS7LPr164dZ4yQxKsKn63CIdFZYBhbDMDo1LNPC4bARQeD/pRAdHc1FF13EokWL2L59O4MHD243mXTdunVcddVVXHTRRYCnx2X37t2dPn9BQQGvvfYa9fX13l/c69evb/eetWvXMmrUKG644QbvsR072t/IFxkZibujhanaaNlywbIsby/L2rVriY+PJyMjo9NlPtjatWt57LHHvJtr7tmzhwMHWndwHTZsGMXFxWzZsqXDXpZhw4axevVqfvGLX3S7DNLzeFd/3eUJJdaubbB7e8eb+Rk2SB9ATN4Q6vuktPaapA/AiEs45rJ8tbeWv3y6l23lnokq2X2imH5aGiPS44753N1lGAYxDoMYh42UGLvnDpn0RIqLa8Jm4TgJPWEZWHqSKVOmcMMNN/Dtt99y+eWXt3stNzeXt956i/PPPx/DMPjtb3/bpcmiU6ZMYc6cOdx111385Cc/YdeuXfy///f/DrnGwoULWbVqFVlZWbz22mt8/vnnZGVled8zcOBAVq1axebNm0lJSSEh4dC/xK+//nqeffZZ7r//fm688Ua2bNnC448/zk033dTuLqiuys3N5bXXXuOkk06iqqqKRx99tF2vyZlnnsno0aO56aabePDBB8nJyWHz5s0YhsH48eO5/fbb+d73vse9997LddddR2RkJB988AHf//73tYZML2HVVHn2y9nVpuekZDd09P9KZCQMyPGs/pqV5/k5IBtbVDT9fLzSa2lNE89v2MfqHZ5bluMjbUwdkcrEgqQev4qqiD8osIS4s846i6SkJLZs2cKUKVPavfbggw9y5513ctlll5GSksJtt91GdXV1p88dFxfH888/zy9/+UsuvPBCCgoKuO+++7yr4gL86Ec/YuPGjdxyyy0YhsFll13G9ddfz8qVK73v+eEPf8iHH37IxRdfTE1Njfe25rYyMjL4+9//zqOPPsr5559PUlIS1157Lf/zP//TzZbxePzxx7n77ruZOHEiGRkZ/PKXv+SRRx5p956//OUvPPLII9x6663U1dV5b2sGGDx4MC+++CK//vWvmTRpEtHR0ZxyyilMnjz5mMolgWdZFhwobV79tbnXZOdWz7GOxCd69s3Jym0NJ/0zDzu/xFcaXCb//PoAC7/aT6PbwgAuLEjihyP6kRitv5JFDkd7CXVCuO+lE+71B+0lFGr7yFhuN5Ts9s4zaZl3Qu1hAnu//t5wYmQN9ixNn5TS6TtTfNEGlmXx0a5qnlu/j301nv+fjk+NYcZp/clLCe25VKH4HQi0cG8Df9VfewmJSK9huZpal6NvCSd7dkBHE+EjIiAjCyMrrzmg5EFWDkZsfOAL3sZOZwN/+XQvX5R4blPuG2vnhlPSODs7Iaxv5xXpCgUWEQkplmVB0U6sjZ9hff05bCrseDJsVAxk5XqGdFrCSeYgDMeRF+kKpOoGNy99WcayTeWYFjhsBlOOT+GKE/oSrVt+RbpEgUVEgs5y7sfa+Dl83RxSKg5awTU+EXIKPEM6g/KadxtOxziGCdv+5DYt3tlSwQufl1LZvCvuGVnxTDs1rdO3KYtIewosIhJwVn0dbCps7UUp2tn+DY5IKDgB4/iTMY4/GQZkh2w4OdjGfbX8Zd1etjbfppzVJ5LpI/tzckbwblMW6Q0UWETE7yy3G7Z/h/X1Z1gbP4Ot30LbtXsMw7Pr8PEnYQw7GfKHYTh6Vk9EWW0Tf1tfyn92VAIQ57Bx7Yh+XDQkWQutifiAAouI+JxlWZ5VYzc2B5Rvv4S6g/bX6ZvW2oMydARGfM+8+6rRbfLG1wd4tXA/Dc23KV+Qn8QPT+pHH92mLOIzYfN/k2max7RAmUg43srYFVZVJdY3n0PLMM/+fe3fEBvnCSbDmkNKanqPvkPGsiw+2e25Tbmk2nPH0tB+Mdw0qj+DQ/w2ZZGeKCwCS2xsLFVVVSQkJCi0SLfV1tYSFdX5/WF6O6upEb7b2DwP5TPPIm1tRdg9QzvDTvIElOzBfl+ULVB2VTTw7Lq9fNZ8m3JKjJ0bTknlnJzEHh3CREJZWAQWu91OXFxcl1aBbSsyMtKnGwr2NOFef/C0ARDWgcUyTaxdW1uHeTZ/DU0HfS8GZLf2oAw5ASOqd/U0VDe6eemLUpZ9W47bArvNYPKwFK48oS8xDv1jSMSfwiKwgCe0dGeFUq1uGN71h/BuA6upEeuzTyj7ZgPu9R9DdWX7NySleCbJNk+WNfokB6Wc/mZaFm98UcQfV22hovk25dED47nx1DQyEnrW5GCRnipsAouIdI5lWbBtE9aaFVhr34faGupaXoyKgeNObB3mycjq1UMglmXxeUktf/+slM0HPIvXDUyMZPpp/TlFtymLBJQCi4gAYJXvx/roXaw1Kz27GbdI6UfC975Pbc5xWLkFGPbQWUnWn74oqeGlL8rYWOqJa3GREVwzvC8X6zZlkaBQYBEJY1ZjA9ZnH2OtWQEbPwfL9LwQGYlx6hiMMRMwho4gacAA6oqLIQyGxDbuq+XFL8r4cq9nQq3DZnDRkGRuPe94Giv3h92woEioUGARCTOWZcHWb5uHfFa3Xx+l4HhPSBk5FiMmFqBXD/m09W1ZHS9+UcZnxZ72sNsMLsjvw5Un9KVfXCR94yIprjzKSUTEbxRYRMKEdaCsdchn757WF/qmYZx5HsaZ4zHSMoJXwCDZvL+eF78o5dMiT1CJMOB7g5O46sS+pMaFx/CXSE+gwCLSi1kNDViffeQZ8vn689YhncgojJGeIR+GnNhj9unxpW3l9bz0RRkf7/Ysd2Az4Ly8PvzgxL7aoFAkBCmwiPQylmXBlq+x1qzEWrca6mpbXxxyYvOQz5kY0bHBK2QQ7XQ28NKXZazZWQV4gso5OYlcfWI/MhMVVERClQKLSC9h7S9tHfLZV9T6Qr/+rUM+qenBK2CQ7a5s4OUvyli9owoLMICzshO4Zng/BvYJ3wUBRXoKBRaRHsxqaMDasMYTUr75onXIJyraM3F2zATPRNowHPJpUVzVyCtflvHe9krM5uY5MyuBa0f0IztJQUWkp1BgEelhLMuCzV977vJZtxrq61pfPG64Z8jn1DMxomOCV8gQsLe6kQWF+1m5tcIbVE4fGM+1w/uRp80JRXocBRaRHsLavw/rw3c9E2hLS1pfSE1vHfLp1z94BQwRpTVNvFq4n3e2OHE3B5WRmXFcO6IfBX3DO8SJ9GQKLCIhzHK7sT79AOv9f3uGfFpExWCc1mbIJ0zWSjmS/bVNvPbVfv61uQJXc5fKyemxXDsilaGpCioiPZ0Ci0gIspoasT5YgfXvRa29KYYBQ0dgjDkP45Qze91OyN3lrHOxcON+/vWdk8bmLpUT+8cydUQ/TkgLzzuhRHojBRaREGLV1WK99xbWO4uhotxzMD4RY/wlGGMnYPRNC24BQ0hlvYvXNx5g6aZyb1AZlhrD1BH9GJGujQlFehsFFpEQYFVVYL2zBGvVUqhtXio/pR/GBZdjnHU+RpTuZmlR1eDmn18f4M1vy6l3efY+GtI3mqknpXJyeqyGx0R6KQUWkSCy9pdivf1PrPf/BY2NnoPpAzEmXoEx+pxDdka2LAu3BS7T8v5xN/9sMi3c5pFes3B18HpTm/e1fd37mgXR0QcwGxuItBtER9iIshtE221E2W1ERrQ+jo4wPMdaXm9+r8NmHHOQqG50s+SbAyz+ppzaJk9QGZwSxdQRqYzMjFNQEenlFFhEgsAq3o21/DWsj1eB2+05mJ2P7eIr4eQzMDH4uqyOdXvK+bSohr3Vjd5AERwVx/RpmwGRETai7Z5AE9UcbNqGnCi70RxwmgNRm8elNU0s+bacmkZPA+QkRXHtiH6MHhivoCISJroVWJYvX86SJUtwOp1kZ2czbdo08vPzO3zvrFmz2Lhx4yHHTznlFO69914AnnrqKd577712r5900kncd9993SmeSMiytn+H+dZC2PBR6yJvQ0dgu+hKKvNOZENxDevWFLOhuIbqxs6lE7vNs7NwhM3AbjOwGwb2iLaPIcJoft7yJ8IgwvD0fEQ0f77tnwhb62uOCBuJiYmUHnDS4DKpd1s0uEwaXRb1btNzzGXR2OZxQ/PjloBlWlDvMql3Abi73X5ZfSK5dkQ/zsxKwKagIhJWuhxY1qxZw/z585kxYwYFBQUsXbqU2bNn88QTT9CnT59D3v+LX/wCl8vlfV5VVcVdd93FmWee2e59J598Mrfeemtrwezq/JHewbIs+OYLT1D5+vPW4yefwc5zr+BT+rJuVw2bPtvsXeAMICHSxqmZ8Zw2IJ6CvtE4IoxDg4WB33sYDMMgIyOD4mKHpy5d4DI9Qabe5Qk5DS6TBrdFfctjb7hpPtb8uKH5ccvnAMbl9mHsoAQibAoqIuGoy6ngzTffZMKECYwfPx6AGTNmsH79et59910mT558yPvj4+PbPf/ggw+IiorijDPOaF8Qu52kpKSuFkckZFmmCZ9/4gkq2zYB0GCP4svRk/k0ezTrnLD/cxdQ5v1MTlIUpw2I57QBcQzpG9Pjfzl7glUEsY6jv1dE5Ei6FFhcLhdbt25tF0xsNhvDhw9n06ZNnTrHypUrGTNmDNHR7deQ2LhxI9OnTycuLo4TTzyRa665hoSEhA7P0dTURFNTk/e5YRjExMR4H/tSy/nCdZw83OsPXW8Dy+XC+uQ/mMsXQtEu9kUn82nW2awbPJZCWwpNJlDk6XWMjDA4OT2O0wbEM3JAPKlxofebXd8BtUG41x/UBqFQ/y4FlsrKSkzTPKQnJCkpiaKioo4/1MbmzZvZtWsXt9xyS7vjJ598MqNHjyYtLY2SkhJeeuklHnvsMWbPno2tg03bFi1axMKFC73Pc3NzmTNnDqmpqV2pTpekp4fvLreg+sPR28BsqKfm329Q/vqLbGyI4tO+w/n09KvZFdtm7RQTMvtEMzavL2Pz+jEyK4loR4SfS+4b+g6oDcK9/qA2CGb9AzpRZOXKlQwaNOiQCbpjx471Ph40aBDZ2dn85Cc/4auvvmL48OGHnGfKlClMmjTJ+7wl8ZWWlrabL+MLhmGQnp5OSUlJl8fve4Nwrz8cvQ2s2moqVvyLdZ99x6dx2XxWMIMaR+sKqzYDhqXGMmqAZz5KVp/I5u9sI+Vl+wJYk+7Rd0BtEO71B7WBv+pvt9s73dnQpcCSmJiIzWbD6XS2O+50Oo86/6S+vp4PPviAq6+++qjX6d+/PwkJCZSUlHQYWBwOBw5Hx13n/voiWZYVll/SFuFef2jfBpZlsXV3KevWfM66cvgufihW7vHe9yZG2jh1QDynZcZzSkYc8VERh5yrp9F3QG0Q7vUHtUEw69+lwGK328nLy6OwsJDTTz8dANM0KSwsZOLEiUf87EcffYTL5eLss88+6nX2799PdXU1ycnJXSmeiF/Vu0w+K6pm7dZS1u+uYj9RQBY0T7XKjWzitPw0ThuYSEHf6B4/YVZEJJR0eUho0qRJPPXUU+Tl5ZGfn8+yZctoaGhg3LhxADz55JOkpKQwderUdp9buXIlo0aNOmQibX19Pa+++iqjR48mKSmJvXv38sILL5Cens5JJ53U/ZqJdJLLtKhrMqltclPbZFLbaHp+Nj+vbjTZvHovn+48QJN3aZQootyNjGgo5rTBqYw8/QRS47V8voiIv3Q5sIwZM4bKykoWLFiA0+kkJyeHmTNneoeEysrKDplFXFRUxDfffMP9999/yPlsNhs7d+7kvffeo6amhpSUFEaMGMHVV1992GEfEQC36Vm7wxMuTGob3a2P2waQg57XNZnUNJrUNbmpaTK9G+d1Rv+6/Yzc/zUj45sYPn4skcMuCNu7BkREAsmwetFgXGlpabvbnX2hddGs4rActwx2/fdUNvLaV/vZX+fyBIzG5sDRZHo3vvOVqAiDWIeN2MgIz0/DJGbvTmL27SKrdi+n7f+GAUPzibjoCoycAp9eO5QF+zsQCsK9DcK9/qA28Ff9HQ6HfybdigSKZVm8vaWCZ9ftpeEoPSB2m0Gcw0aMw0ZcpI0YR4T3eazDRqyjOYC0fR550HOHzTvnxHK7sd59E2vxS1BXC4ZB7HmX0DBuFqQPDEDtRUTkYAosEnIq6108+XEJH++uBmB4/1jOy+vTJpS0DyCOiEPX6ukua1Mh5ovPwJ4dngM5BUT88L/pO+bcsP2XlYhIKFBgkZCyobiGP3xYTHmdC7sNfnhSKpOHpfh9ozvLeQBr4V+xPm7ehDM+AWPKf2GcdT5GRM9Y2E1EpDdTYJGQ0Og2mf9ZKUu+KQdgYGIkPx+bSV5K9FE+eWwslwtr5ZtYS16C+jowDIxzLsSY/COM+ES/XltERDpPgUWCboezgcc/KGKHswGAiwqSuPHUNKLsvhvq6Yj17Zee4Z+inZ4DuUOwTb05rCbUioj0FAosEjSWZbF0UznPry+lybToExXBT87IYNTA+KN/+Fiu69yP9epfsT75j+dAfCLG5f+FMfZ7GB3sXSUiIsGnwCJBUV7n4v8+LGZ9cQ0AIzPj+OkZGSTF+O8rablcWCuWYC15GRqah3/OnegZ/onreGdwEREJDQosEnCf7K7ijx+VUNngJjLC4IZT0rh4SJJfF2CzvvnCM/xTvMtzIO84bFP/GyN7sN+uKSIivqPAIgHT4DJ5bv0+ln/nBCAnKYqfj81kUJL/lrS3yvdjvfoc1tr3PQfiEzGuvAHjzPM0/CMi0oMosEhAbDlQz+MfFLGnshGAycNS+NFJ/Xy6hkpblqupzfBPPRg2jHETMS77EUacf+fIiIiI7ymwiF+5TYs3vj7AP74oxWVCSoyd/zkzg5Mz4vx2Tevrzz3DPyW7PQcGD/Xc/TNIwz8iIj2VAov4TWlNE098WEzh3loAzsyK59bRGSRG+WchNutAGdaCeViffuA5kNAH44obMM4cr+EfEZEeToFF/GL1jkqe/qSEmkaTaLvBjNP6MyGvj18m1lquJqy3F2MtfaV1+Gf8xRiXTcWI1fCPiEhvoMAiPlXb5OYv6/aycmslAAV9o7lzTCaZiZF+uZ61cQPmS3+Gkj2eA/nDsF17M8agPL9cT0REgkOBRXzmm9I65q4pYm91EzYDrjyhL1cP74fd5odelQOlmAvmwadrPAcS+mBceaNn+MfP+w6JiEjgKbDIMXObFgsKy1hQuB/TgrQ4O3eMyeT4tFifX8tqasJ6+59YSxdAY4Nn+Oe8SzAuvVbDPyIivZgCixyTkqpG5q4p5tuyOgDOzUnk5lH9iYv0/cRa66vm4Z+9LcM/x2P74c0YA3N9fi0REQktCizSLZZl8e62Sp5Zu5d6l0msw8Z/j+rPubl9fH+t/aWYC56F9R96DiQmeYZ/zhin4R8RkTChwCJdVt3g5ulPSvhgZxUAx6fGcMeYTNLiHT6/lvXZR5h/edwz/GOzYZw3CeP712LE+m8dFxERCT0KLNIlX5TU8MSHxeyvdRFhwLUj+nH58X2J8MPEWnPt+1jPPg6m2Tz8898YA3N8fh0REQl9CizSKU1ui398vo9FGw9gAZkJDu4cm0lB3xi/XM9cswLr+T+CZWKcMR7jhp9iRPhnwTkREQl9CixyVNv31/DLf21ny4F6AC7I78O0U/sT4/DP6rHmf5Zj/f1pAIyzL8D40a1aqVZEJMwpsMgRvbetgic//pYGl0lCVAS3jU7nzKwEv13PfGcx1ivPAnjmq1wzQxNrRUREgUUO742vD/Dc+n0AnJwRx0/PSKdvrO8n1rYw31qI9fp8AIwLL8e44nqFFRERARRYpAOWZTH/s1Je33gAgGtHZnH10Dj8FR0sy8Ja8hLWkpcBML5/jedOIIUVERFppokB0o7btPi/j0q8YeW/Tk7ljvH52PwUHizLwnrtb61h5fL/wnbpVIUVERFpRz0s4tXgMvnt6j2s3VODzYDbRqdzfn6y38KDZVlYrzyLtWIJAMbVP8b2vcv8ci0REenZFFgEgKoGN7Pf283XpXVERhjcdVYmpw/03+RayzSx/vEnrP/8CwDjh7dgG3eR364nIiI9mwKLUFbbxEMrd7GzopG4SBv3nzvQLxsXtrDcbqy//R/Wh+96Ni+84SfYxkzw2/VERKTnU2AJc7srGpi1cheltS5SYuzMOi+L7KQov13Pcrmw5s3FWrfas9T+9J9jG3W2364nIiK9gwJLGPu2rI5HVu2mqsHNgMRIZo3P8st+QC2spibMP/8GPvsYIuzYbroL49Qz/XY9ERHpPRRYwtT6omp+/Z89NLgtCvpG86txA0mM9t/XwWpswPzT/0LherA7sN16L8bw0/x2PRER6V0UWMLQqm0V/N+HxbgtOCUjjnvOHuC3ZfYBrPo6zCcfhW+/hMgobLffjzHsJL9dT0REeh8FljDTdvXac3IS+ekZGTgi/LfmiVVbg/nHh2Hz1xAdg+0nv8IYcoLfriciIr2TAkuYOHj12u8PTWbaqWl+WxAOwKqpwnxiFmz/DmLjsP3PLIy84/x2PRER6b0UWMKA27R48uMSVm6tAOC6k1O54vgUv64ma1VVYM79FezeBvEJ2O54GGPQYL9dT0REejcFll6uo9Vrvzc4ya/XtJwHMOc+AMW7IDEJ252PYAzI9us1RUSkd1Ng6cUCvXotgHWgFPPx+2FfMST1xfbzRzHSB/j1miIi0vspsPRSgV69FsAqLfGElf37oG+aJ6ykpvv1miIiEh66FViWL1/OkiVLcDqdZGdnM23aNPLz8zt876xZs9i4ceMhx0855RTuvfdewDMhdMGCBaxYsYKamhqGDh3K9OnTycjI6E7xwt7uigYeXLmLsgCtXgtglezxhBXnfkjL8ISVlFS/XlNERMJHlwPLmjVrmD9/PjNmzKCgoIClS5cye/ZsnnjiCfr06XPI+3/xi1/gcrm8z6uqqrjrrrs488zWFU7feOMN3nrrLW677TbS0tJ45ZVXmD17NnPnziUyMrKbVQtPgV69FsDasxNz7v1Q6YSMLM+claQUv15TRETCS5dXC3vzzTeZMGEC48ePZ+DAgcyYMYPIyEjefffdDt8fHx9PUlKS988XX3xBVFQUZ5xxBuDpXVm2bBmXX345o0aNIjs7m9tvv53y8nLWrl17bLULM+uLqnngnZ1UNbgp6BvNr88f5P+wsnML5u9mesLKwBxsv5itsCIiIj7XpcDicrnYunUrw4cPbz2Bzcbw4cPZtGlTp86xcuVKxowZQ3R0NAD79u3D6XQyYsQI73tiY2PJz8/v9DnFs3rto6t20+C2OCUjjkcmDPLrUvsA1tZvPcNA1ZWQne8JK4lJfr2miIiEpy79RqusrMQ0TZKSktodT0pKoqio6Kif37x5M7t27eKWW27xHnM6nQCHDCf16dPH+9rBmpqaaGpq8j43DIOYmBjvY19qOZ8/1yw5Vm98vZ95n3pWrz03J5Gfnpnps9VrD1d/67uvMP/wENTXweBhRPzPgxixcT65ZqjpCd8Bfwr3+oPaINzrD2qDUKh/QO8SWrlyJYMGDTrsBN3OWrRoEQsXLvQ+z83NZc6cOaSm+m+SZ3p66N3tYlkWT/5nC/Obw8q1I7P42fh8v6xe27b+9Z99QtkTs6ChnqjhI+n34O+xxfj3DqRQEIrfgUAK9/qD2iDc6w9qg2DWv0uBJTExEZvNdkjPh9PpPKTX5WD19fV88MEHXH311e2Ot3yuoqKC5ORk7/GKigpycnI6PNeUKVOYNGmS93lL4istLW03wdcXDMMgPT2dkpISLMvy6bmPhdu0ePKjYlY0r177XyencsXQOPaWlPj0OgfX3/xyHeZTj4GrCeOEU3Hdci97nRXgrPDpdUNJqH4HAiXc6w9qg3CvP6gN/FV/u93e6c6GLgUWu91OXl4ehYWFnH766QCYpklhYSETJ0484mc/+ugjXC4XZ599drvjaWlpJCUl8eWXX3oDSm1tLZs3b+aCCy7o8FwOhwOHo+PJpP76IlmWFTJf0iOtXuvP+pvrP8R85jfgdsFJp2PcfA84HCHTLv4WSt+BYAj3+oPaINzrD2qDYNa/y0NCkyZN4qmnniIvL4/8/HyWLVtGQ0MD48aNA+DJJ58kJSWFqVOntvvcypUrGTVqFAkJ7VdaNQyDiy++mNdff52MjAzS0tJ4+eWXSU5OZtSoUd2vWS9V1eDm0VW7+aYscKvXApifvI/57O/ANDFGjsWY/nMMu9YdFBGRwOjyb5wxY8ZQWVnJggULcDqd5OTkMHPmTO/QTllZ2SGTcoqKivjmm2+4//77OzznZZddRkNDA8888wy1tbUMHTqUmTNnag2WgwRj9VqAmnfexPzL78AyMc4Yj3HDTzEiIvx+XRERkRaG1Yv6tkpLS9vdPeQLhmGQkZFBcXFxULsBg7F6LYC1djXmn38DgHH2BRg/uhXD1uXle3q0UPkOBEu41x/UBuFef1Ab+Kv+DofDP3NYJDiCsXotgFVfi/nSnwEwxl+Mcc1NYRdWREQkNCiwhLjPimt47D3PgnAFfaP51biBfl8QroX11utQ5cSemYV19XRQWBERkSBRYAlhpmXx1MfF3tVr7zl7ADGOwIQG60Ap1tv/BKDPDT+hwh4+dwOJiEjo0T+ZQ9jX++rYV+Mi1mHj3nMCF1YArEUvQFMjFJxAzJjxAbuuiIhIRxRYQtiq7Z7F2MYMSiDKHsCwsmML1keezSwjfjAtbJeiFhGR0KHAEqKa3CYf7KwCPPsDBYplWZivPgeAcfq5GLlDAnZtERGRw1FgCVHrimqoaTTpG2vnxP4B3Kfn80/g2y/B7sC4/LrAXVdEROQIFFhC1HvbPMNB52Qn+mUzw45YLhfmwucBML53KUbftIBcV0RE5GgUWEJQdaObtXtqABiXG8DhoP8sh717ID4R46IrA3ZdERGRo1FgCUFrdlbhMi2yk6LISY4OyDWt2hqsJS8BYFw6FSM2LiDXFRER6QwFlhD03vZKIMCTbZe9CtVVkD4Q45wLA3ZdERGRzlBgCTGlNU0U7q0F4JwABRarbC/WisUA2K68URsbiohIyFFgCTH/ae5dObF/LKlx/t8vCMB6fT64XDB0BIw4LSDXFBER6QoFlhAT6OEga+u3WGvfB8PAdtWNWiRORERCkgJLCNleXs8OZwN2m8GYQQl+v167ReLOGI8xaLDfrykiItIdCiwhZNU2T+/KqAHxxEcGYB7J+g9h89cQGYkxRYvEiYhI6FJgCRGmZXnnr5wbgLVXLFcT5mvPA2BcMAUjua/frykiItJdCiwhonBvLfvrXMRF2jgt0/9roFjvLoPSEuiTjHHh5X6/noiIyLFQYAkRLZNtzxqUiCPCv/9ZrJoqrDdfAcC47IcY0TF+vZ6IiMixUmAJAY1ukzUB3JnZenMB1FbDgGyMsRP8fj0REZFjpcASAtbuqaa2ySQ11s6wNP/2dlj7irDeXQo0LxJn0yJxIiIS+hRYQsB7zXcHnZPj/52Zzdfmg9sFJ5yCceKpfr2WiIiIryiwBFlVg5tPi6oBGJfbx6/Xsr7bCOvXgGHDdtU0v15LRETElxRYguyDnZW4TMhNjmJQUpTfrmOZZusicWd9D2NAtt+uJSIi4msKLEHWMhzk78m21rrVsG0TREVjXPZDv15LRETE1xRYgmhvdSMbS+sw8O/OzFZTo2eDQ8CYeDlGn2S/XUtERMQfFFiCqGVl2+HpsfSN9d/OzNaKJbB/HyT1xTh/it+uIyIi4i8KLEFiWZZ37yB/DgdZVRVYy14FwJjyI4wo/82TERER8RcFliDZVt7A7spGIiMMzszy387M1pKXoK4WBuVhnDHeb9cRERHxJwWWIFm1rQLw7Mwc56edma3i3VjvLQfAdtU0DJv+c4uISM+k32BB4DYt/rOjeSl+P+7MbL72PJgmnHQ6xtARfruOiIiIvymwBMGXe2spr3OREGnj1Ix4v1zD+vZL+PwTsNmwXXGDX64hIiISKAosQfDeds9w0FnZiTgifL8Uv2WamAuaF4k7ZyJGxkCfX0NERCSQFFgCrMFl8uFOz1L8/ro7yPpoFezcAjGxGJde65driIiIBJICS4B9sruaOpdJWpyDoam+35nZamjAWvR3AIyLrsJI8O/+RCIiIoGgwBJgLcNB43ITMfywM7P1zhvg3A990zC+932fn19ERCQYFFgCqLLexfqiGsA/w0FWRTnWW68BYEy5DsMR6fNriIiIBIMCSwCt3lmF24LBKdEM7OP7FWetxS9CQx3kFGCMOtvn5xcREQkWBZYA8udS/NaeHVjvvw2A7Qc/1iJxIiLSq+i3WoCUVDXybVkdNgPO9kNgMRf+FSwTTj0To+B4n59fREQkmOzd+dDy5ctZsmQJTqeT7Oxspk2bRn5+/mHfX1NTw0svvcQnn3xCdXU1qampXH/99Zx66qkALFiwgIULF7b7TGZmJk888UR3iheS3mvemXlEehwpMd1q9sOyvtoAheshwo7tiut9em4REZFQ0OXfnGvWrGH+/PnMmDGDgoICli5dyuzZs3niiSfo0+fQW2hdLhePPvooiYmJ3HnnnaSkpFBWVkZsbGy792VlZfHAAw94n9t60ZCGP3dmtkw35qvNi8SNvxgjLdOn5xcREQkFXQ4sb775JhMmTGD8eM/OvzNmzGD9+vW8++67TJ48+ZD3r1y5kurqah555BHsds/l0tLSDnmfzWYjKSmpq8XpETYfqKeoyrMz8xlZvl2K3/pgBezZAbFxGJOu9um5RUREQkWXAovL5WLr1q3tgonNZmP48OFs2rSpw898+umnFBQUMG/ePNatW0diYiJjx45l8uTJ7XpRSkpKuPnmm3E4HAwZMoSpU6fSr1+/Ds/Z1NREU1OT97lhGMTExHgf+1LL+Y7lvC3DQWdkJRAX6bvhIKu+DuuNfwBgm3QNtnjfz43xRf17unBvg3CvP6gNwr3+oDYIhfp36bdnZWUlpmke0hOSlJREUVFRh5/Zu3cvpaWlnHXWWdx7772UlJTw7LPP4na7ueqqqwAoKCjg1ltvJTMzk/LychYuXMivfvUrHn/8cW8QaWvRokXt5rzk5uYyZ84cUlNTu1KdLklPT+/W51ymyQc7NwMw5dQcMjI6DmHdUfHCM1RWlBORPoCMqT/267or3a1/bxLubRDu9Qe1QbjXH9QGway/b2d/dsCyLBITE7n55pux2Wzk5eVx4MABFi9e7A0sp5xyivf92dnZ3gDz4Ycfct555x1yzilTpjBp0iTv85bEV1paisvl8mn5DcMgPT2dkpISLMvq8ufXF1VzoLaJxKgIsqMbKS4u9km5rPL9uF/7m+fx5OsoKdvvk/Me7Fjr3xuEexuEe/1BbRDu9Qe1gb/qb7fbO93Z0KXAkpiYiM1mw+l0tjvudDoPO/8kKSkJu93ebvhnwIABOJ1OXC6Xd15LW3FxcWRmZlJSUtLhOR0OBw6Ho8PX/PVFsiyrW+detdWzFP/Z2QlEGL4rn/nPv0NjI+QPg1PP9Pv/QN2tf28S7m0Q7vUHtUG41x/UBsGsf5duxbHb7eTl5VFYWOg9ZpomhYWFDBkypMPPHHfccZSUlGCapvdYcXExycnJHYYVgPr6ekpKSnr8JNx6l8lHu6sAODfXd5sQWju3Yq1ZCYDtqmlhO6YqIiLho8v3Dk+aNIkVK1awatUqdu/ezbPPPktDQwPjxo0D4Mknn+TFF1/0vv+CCy6gurqa559/nqKiItavX8+iRYu48MILve+ZP38+GzduZN++fXz77bf89re/xWazcdZZZx17DYPo411V1Lss0uMdDOkb7ZNzWpbVvEichTHqbIy843xyXhERkVDW5TksY8aMobKykgULFuB0OsnJyWHmzJne3pCysrJ2/+Lv168f9913H3/729+46667SElJ4aKLLmp3p9GBAwf4wx/+QFVVFYmJiQwdOpTZs2eTmOj7u14CqeXuIJ/uzPzlOvj6c7DbMaZc55tzioiIhLhuTbqdOHEiEydO7PC1WbNmHXJsyJAhzJ49+7Dn+9nPftadYoQ0Z72LDcUtOzP7ZjjIcrsxFz4PgDHh+xip4T1bXUREwkfvWU42xKzeUYlpQUHfaDITfXO7sfX+v6F4F8QnYFx8lU/OKSIi0hMosPiJr5fit+pqsRZ75gYZ378WI9a3K+aKiIiEMgUWPyiqbOS7/fWenZmzfRRY3loIVRXQfwDGOR0Px4mIiPRWCix+8N52z9orp2TEkeSDnZmt/aVY7ywGwHbl9RiHuR1cRESkt1Jg8bG2OzOf46vhoEXzoakRhpwIJ432yTlFRER6EgUWH9u0v56S6iai7QZnZCUc8/ms7d9hffweALYfaJE4EREJTwosPvbeNs9w0BkDE4i2H3vzmm80T7Q9YzxGdv4xn09ERKQnUmDxIZdp8f6OlqX4j304yDLdsMmzDYJx4ZRjPp+IiEhPpcDiQ58V11DZ4KZPdAQnpccd+wlL9kBjA0RFQ2bWsZ9PRESkh1Jg8aH3WibbZicSYTv2uSbWji2eB1m5GLaIYz6fiIhIT6XA4iO1Te42OzP7aA+kHZsBNHdFRETCngKLj3y8q5pGt0VmQiT5KT7ambmlh2XQYJ+cT0REpKdSYPGRVT7emdky3bBrK6AeFhEREQUWHyivc/FFiWdnZl8tFsfeImioh8goyBjgm3OKiIj0UAosPvB+887Mx/WLISPBRzszN89f0YRbERERBRaf8PXOzAA0z1/RcJCIiIgCyzHbXdHAlgP1RBhwVvaxL8XfwtvDkq0JtyIiIgosx+i95sm2p2bG0SfaN7soW6YJO7cB6mEREREBBZZj0n5n5j6+O/HeImiog8hISB/ou/OKiIj0UAosx+Cb0jr21TQRbbcxemC8z87bOuE2DyNCE25FREQUWI5By3DQmEHxRPlgZ2avlgm3WjBOREQEUGDptia3xeodLXcH+XA4CLB2tky41fwVERERUGDptvXF1VQ1miRHRzC8f6zPzuuZcNuywq16WERERECBpdu8OzPn+GZnZq99RVDfPOE2I8t35xUREenBFFi6oabRzdo91QCcm+vj4aCWDQ8H5mrCrYiISDMFlm74cFcVjW6LgYmR5CVH+fbkzXcIaThIRESklQJLN7zn452Z2/L2sGjCrYiIiJcCSxftr23iy5JawIc7MzfzTLht2UNIPSwiIiItFFi66P0dlVjA8akx9I/3zc7MXvuKPRNuHZGQMci35xYREenBFFi6aFWbu4N8zbvC7cAcTbgVERFpQ4GlC3Y6G9hW3oDdBmOzfR9YWoeDNH9FRESkLQWWLmiZbDsyM57EKN/3gLROuNX8FRERkbYUWDrJtCze21YBwLn+GA5qN+FWPSwiIiJtKbB00sZ9dZTWuoh12DhtgO92ZvYqLYG6WrA7tMKtiIjIQRRYOqmld2XMoATf7szczDvhNisXw273+flFRER6MgWWTmh0maze2bIzsx8m2wLs0PorIiIih6PA0gkfbN1PTaNJ3xg7J6T5bmfmtrw9LIMUWERERA6mwNIJy78uAfywM3Mzy7Jg51ZAE25FREQ6osByFNWNbt7fUgbAubl+Gg4qLYa6Gs+E20ytcCsiInKwbs3uXL58OUuWLMHpdJKdnc20adPIzz98z0BNTQ0vvfQSn3zyCdXV1aSmpnL99ddz6qmndvucgbJmRyVNbovspChykny8M3Mz7/ormnArIiLSoS7/dlyzZg3z589nxowZFBQUsHTpUmbPns0TTzxBnz59Dnm/y+Xi0UcfJTExkTvvvJOUlBTKysqIjY3t9jkDyZ87M3s1z1/RhFsREZGOdXlI6M0332TChAmMHz+egQMHMmPGDCIjI3n33Xc7fP/KlSuprq7mrrvuYujQoaSlpXH88ceTk5PT7XMGSmlNE1/ubdmZ2X/BydvDogm3IiIiHepSD4vL5WLr1q1MnjzZe8xmszF8+HA2bdrU4Wc+/fRTCgoKmDdvHuvWrSMxMZGxY8cyefJkbDZbt87Z1NREU1OT97lhGMTExHgf+0pitJ3/GZNJWWMEafGRnsmxPuaZcOsJLLacAv/14nRTS3lCrVyBFO5tEO71B7VBuNcf1AahUP8uBZbKykpM0yQpKand8aSkJIqKijr8zN69eyktLeWss87i3nvvpaSkhGeffRa3281VV13VrXMuWrSIhQsXep/n5uYyZ84cUlNTu1KdTsn186KzruLdFNfWgCOSjJGjQ3YOS3p6erCLEHTh3gbhXn9QG4R7/UFtEMz6+/23o2VZJCYmcvPNN2Oz2cjLy+PAgQMsXryYq666qlvnnDJlCpMmTfI+b0l8paWluFwun5S77bnT09MpKSnxSw+LuXaN58GAbEpKS31+/mPl7/r3BOHeBuFef1AbhHv9QW3gr/rb7fZOdzZ0KbAkJiZis9lwOp3tjjudzkN6SFokJSVht9ux2VqnywwYMACn04nL5erWOR0OBw6Ho8PX/PVFsizLP0NC278DPBNuQ/l/An/VvycJ9zYI9/qD2iDc6w9qg2DWv0uTbu12O3l5eRQWFnqPmaZJYWEhQ4YM6fAzxx13HCUlJZim6T1WXFxMcnIydru9W+fsTbwTbrVgnIiIyGF1+S6hSZMmsWLFClatWsXu3bt59tlnaWhoYNy4cQA8+eSTvPjii973X3DBBVRXV/P8889TVFTE+vXrWbRoERdeeGGnz9lbtZ1wq1uaRUREDq/Lc1jGjBlDZWUlCxYswOl0kpOTw8yZM73DN2VlZe1mEffr14/77ruPv/3tb9x1112kpKRw0UUXtbsr6Gjn7LVKS6C2Bux2rXArIiJyBN2adDtx4kQmTpzY4WuzZs065NiQIUOYPXt2t8/ZW3mHgwbkYNg7npMjIiIi2ksouLwr3Gr+ioiIyJEosASRtbNlwq3mr4iIiByJAkuQWJYFO1om3KqHRURE5EgUWIKlbC/UVnsm3A7QhFsREZEjUWAJlub5K5pwKyIicnQKLEFi7dD6KyIiIp2lwBIkVksPiwKLiIjIUSmwBIEm3IqIiHSNAkswtEy4jbBDZnawSyMiIhLyFFiCoWX9lQHZGIfZdVpERERaKbAEgeVd4VbzV0RERDpDgSUIvHsIaf6KiIhIpyiwBFj7CbfqYREREekMBZZA278Paqo8E24H5AS7NCIiIj2CAkugtQwHDRikCbciIiKdpMASYK0TbjV/RUREpLMUWALMO+F2kOaviIiIdJYCSwBZlgU71cMiIiLSVQosgXSgFKqrICICBmqFWxERkc5SYAmklg0PMwdhOCKDWxYREZEeRIElgCxteCgiItItCiwB1HKHEFowTkREpEsUWAKk/Qq36mERERHpCgWWQDlQBtWVzRNuc4JdGhERkR5FgSVQWoaDMjThVkREpKsUWALE0oaHIiIi3abAEiDWzpYJt5q/IiIi0lUKLAHQfsKtelhERES6SoElEMrLoKoCbDZNuBUREekGBZZAaNnwMHMQRmRUcMsiIiLSAymwBEDLgnFaf0VERKR7FFgCoOUOIU24FRER6R4FFj/zTLht6WHRhFsREZHuUGDxt/L9mnArIiJyjBRY/K1l/RVNuBUREek2BRY/0wq3IiIix06Bxc804VZEROTYKbD4UbsJt4PUwyIiItJdCiz+5DwAlU7PhNus3GCXRkREpMdSYPGnHd95fmZkacKtiIjIMbB350PLly9nyZIlOJ1OsrOzmTZtGvn5Hc/RWLVqFU8//XS7Yw6Hg3/84x/e50899RTvvfdeu/ecdNJJ3Hfffd0pXshonXCr+SsiIiLHosuBZc2aNcyfP58ZM2ZQUFDA0qVLmT17Nk888QR9+vTp8DMxMTH84Q9/OOJ5Tz75ZG699dbWgtm7laVCSuuEW81fERERORZdHhJ68803mTBhAuPHj2fgwIHMmDGDyMhI3n333cN+xjAMkpKS2v05mN1ub/d6fHx8V4sWUtqvcKseFhERkWPRpW4Ml8vF1q1bmTx5sveYzWZj+PDhbNq06bCfq6+v59Zbb8WyLHJzc7n22mvJyspq956NGzcyffp04uLiOPHEE7nmmmtISEjo8HxNTU00NTV5nxuGQUxMjPexL7Wcr8vnbZlwa9gwsnJ9Xq5A6Xb9e5Fwb4Nwrz+oDcK9/qA2CIX6dymwVFZWYprmIT0kSUlJFBUVdfiZzMxMbrnlFrKzs6mtrWXx4sXcf//9zJ07l759+wKe4aDRo0eTlpZGSUkJL730Eo899hizZ8/GZju0E2jRokUsXLjQ+zw3N5c5c+aQmpralep0SXp6epfeX7djE2WAY1Au6Tk9/w6hrta/Nwr3Ngj3+oPaINzrD2qDYNbf7xNFhgwZwpAhQ9o9v+OOO3j77be55pprABg7dqz39UGDBpGdnc1PfvITvvrqK4YPH37IOadMmcKkSZO8z1sSX2lpKS6Xy6flNwyD9PR0SkpKPMM8neT+bC0ArgHZFBcX+7RMgdTd+vcm4d4G4V5/UBuEe/1BbeCv+tvt9k53NnQpsCQmJmKz2XA6ne2OO53ODuelHK5wubm5lJSUHPY9/fv3JyEhgZKSkg4Di8PhwOFwdPhZf32RLMvq0rmt7c17CA3K7xVf7q7WvzcK9zYI9/qD2iDc6w9qg2DWv0uTbu12O3l5eRQWFnqPmaZJYWFhu16UIzFNk507d5KcnHzY9+zfv5/q6uojvifk7dQeQiIiIr7S5SGhSZMm8dRTT5GXl0d+fj7Lli2joaGBcePGAfDkk0+SkpLC1KlTAVi4cCEFBQWkp6dTU1PD4sWLKS0tZcKECYBnQu6rr77K6NGjSUpKYu/evbzwwgukp6dz0kkn+a6mAWQ590NFORg2yMoLdnFERER6vC4HljFjxlBZWcmCBQtwOp3k5OQwc+ZM75BQWVlZu1nE1dXVPPPMMzidTuLi4sjLy+PRRx9l4MCBgOcuo507d/Lee+9RU1NDSkoKI0aM4Oqrrz7ssE/Ia1l/JWMgRpRWuBURETlW3Zp0O3HiRCZOnNjha7NmzWr3/IYbbuCGG2447LkiIyN7/Iq2B7O8669oOEhERMQXtJeQH7SucKsF40RERHxBgcUfdmjCrYiIiC8psPiY5TwAFQc04VZERMSHFFh8rWU4KH0ARlR0cMsiIiLSSyiw+JilDQ9FRER8ToHFx6ydLRNuNX9FRETEVxRYfE09LCIiIj6nwOJDVkU5OA+AYUBWz9+hWUREJFQosPhSc+8K6QMxomOCWxYREZFeRIHFhyytvyIiIuIXCiw+1HKHkCbcioiI+JYCiy+19LAM0oRbERERX1Jg8RGrshyc+z0TbgdphVsRERFfUmDxlZYVbvsP0IRbERERH1Ng8ZHWFW41f0VERMTXFFh8pOUOIbRgnIiIiM8psPiKbmkWERHxGwUWH7AqnVBepgm3IiIifqLA4gveCbeZGNGxwS2LiIhIL6TA4gPeCbdaf0VERMQvFFh8oHXCreaviIiI+IMCiy/sbO5hyVEPi4iIiD8osBwjq6oCDmjCrYiIiD8psByrlg0PNeFWRETEbxRYjpGlDQ9FRET8ToHlGLXcIaQJtyIiIv6jwHKsvCvcqodFRETEXxRYjoFVVQkHSj1PNOFWRETEbxRYjoV3wu0AjBhNuBUREfEXBZZj4F3hVvNXRERE/EqB5RhYO7XCrYiISCAosByL7S09LJpwKyIi4k8KLN3UbsJtlibcioiI+JMCS3e1TLhNy8SIjQtuWURERHo5BZZu0oRbERGRwFFg6abWCbeavyIiIuJvCizd5V3hVj0sIiIi/qbA0g1WdSXs3+d5MkiBRURExN8UWLqjuXeFtAxNuBUREQkAe3c+tHz5cpYsWYLT6SQ7O5tp06aRn9/xXI5Vq1bx9NNPtzvmcDj4xz/+4X1uWRYLFixgxYoV1NTUMHToUKZPn05GRkZ3iud3rRNuNX9FREQkELocWNasWcP8+fOZMWMGBQUFLF26lNmzZ/PEE0/Qp0+fDj8TExPDH/7wh8Oe84033uCtt97itttuIy0tjVdeeYXZs2czd+5cIiMju1pEv7N2aIVbERGRQOrykNCbb77JhAkTGD9+PAMHDmTGjBlERkby7rvvHvYzhmGQlJTU7k8Ly7JYtmwZl19+OaNGjSI7O5vbb7+d8vJy1q5d261K+V1LD4vmr4iIiAREl3pYXC4XW7duZfLkyd5jNpuN4cOHs2nTpsN+rr6+nltvvRXLssjNzeXaa68lKysLgH379uF0OhkxYoT3/bGxseTn57Np0ybGjh17yPmamppoamryPjcMg5iYGO9jX2o5X8vPthNujZx8n18v1Bxc/3AU7m0Q7vUHtUG41x/UBqFQ/y4FlsrKSkzTbNdDApCUlERRUVGHn8nMzOSWW24hOzub2tpaFi9ezP3338/cuXPp27cvTqcT4JDhpD59+nhfO9iiRYtYuHCh93lubi5z5swhNTW1K9XpkvT0dADqN+ygFLBnDCRjcIHfrhdqWuofzsK9DcK9/qA2CPf6g9ogmPXv1qTbrhgyZAhDhgxp9/yOO+7g7bff5pprrunWOadMmcKkSZO8z1sSX2lpKS6X69gKfBDDMEhPT6ekpATLsjDXfwKAe0AOxcXFPr1WKDq4/uEo3Nsg3OsPaoNwrz+oDfxVf7vd3unOhi4FlsTERGw22yE9H06n85BelyMVLjc3l5KSEgDv5yoqKkhOTva+r6KigpycnA7P4XA4cDgcHb7mry+SZVmewNKyh1D24LD60rbUP5yFexuEe/1BbRDu9Qe1QTDr36VJt3a7nby8PAoLC73HTNOksLCwXS/KkZimyc6dO73hJC0tjaSkJL788kvve2pra9m8eXOnzxlQ3hVudUuziIhIoHR5SGjSpEk89dRT5OXlkZ+fz7Jly2hoaGDcuHEAPPnkk6SkpDB16lQAFi5cSEFBAenp6dTU1LB48WJKS0uZMGEC4Olmuvjii3n99dfJyMggLS2Nl19+meTkZEaNGuW7mvqAVVMFZXs9T3SHkIiISMB0ObCMGTOGyspKFixYgNPpJCcnh5kzZ3qHdsrKytrNIq6uruaZZ57B6XQSFxdHXl4ejz76KAMHDvS+57LLLqOhoYFnnnmG2tpahg4dysyZM0NvDZaW9VdS0zHi4oNbFhERkTDSrUm3EydOZOLEiR2+NmvWrHbPb7jhBm644YYjns8wDK6++mquvvrq7hQnYFoWjNP6KyIiIoGlvYS6wjvhVvNXREREAkmBpQusnS0TbtXDIiIiEkgKLJ1k1VRDqedWbO0hJCIiElgKLJ3U0rtCv/4YcQnBLYyIiEiYUWDprO2tC8aJiIhIYCmwdJLVskOzJtyKiIgEnAJLJ3lvaVYPi4iISMApsHSCWV0Fpc0bHWoNFhERkYBTYOmExi3feB70TcOITwxuYURERMKQAksnNG7+2vNA81dERESCQoGlE1oCi+aviIiIBIcCSyc0bfYMCekOIRERkeDo1uaH4cSqrcFdtMvzRD0sIiIiQaEelqNoXeFWE25FRESCRYHlaLRgnIiISNApsBxF64JxCiwiIiLBosByFC1L8mv+ioiISPAosByBVVsDe4sA9bCIiIgEk+4SOgrb1dOJraumPj4Ry7KCXRwREZGwpMByBEZsHMb5l5GckUFxcXGwiyMiIhK2NCQkIiIiIU+BRUREREKeAouIiIiEPAUWERERCXkKLCIiIhLyFFhEREQk5CmwiIiISMhTYBEREZGQp8AiIiIiIU+BRUREREKeAouIiIiEPAUWERERCXkKLCIiIhLyetVuzXa7/6rjz3P3BOFef1AbhHv9QW0Q7vUHtYGv69+V8xmWZVk+vbqIiIiIj2lI6Cjq6uq45557qKurC3ZRgiLc6w9qg3CvP6gNwr3+oDYIhforsByFZVls27aNcO2ICvf6g9og3OsPaoNwrz+oDUKh/gosIiIiEvIUWERERCTkKbAchcPh4Morr8ThcAS7KEER7vUHtUG41x/UBuFef1AbhEL9dZeQiIiIhDz1sIiIiEjIU2ARERGRkKfAIiIiIiFPgUVERERCXnhvitAJy5cvZ8mSJTidTrKzs5k2bRr5+fnBLpbfLVq0iE8++YQ9e/YQGRnJkCFD+NGPfkRmZmawixYU//znP3nxxRe5+OKLueGGG4JdnIA5cOAAL7zwAp999hkNDQ2kp6dz6623Mnjw4GAXze9M02TBggW8//77OJ1OUlJSOPfcc7niiiswDCPYxfOLjRs3snjxYrZt20Z5eTm/+MUvOP30072vW5bFggULWLFiBTU1NQwdOpTp06eTkZERxFL7zpHq73K5ePnll9mwYQP79u0jNjaW4cOHM3XqVFJSUoJcct852negrT//+c+88847XH/99VxyySV+L5t6WI5gzZo1zJ8/nyuvvJI5c+aQnZ3N7NmzqaioCHbR/G7jxo1ceOGFzJ49m/vvvx+3282jjz5KfX19sIsWcJs3b+btt98mOzs72EUJqOrqah544AHsdjszZ87k97//Pf/1X/9FXFxcsIsWEP/85z95++23+fGPf8zvf/97fvjDH7J48WLeeuutYBfNbxoaGsjJyeHHP/5xh6+/8cYbvPXWW8yYMYPHHnuMqKgoZs+eTWNjY4BL6h9Hqn9jYyPbtm3jiiuuYM6cOfz85z+nqKiI3/zmN0Eoqf8c7TvQ4pNPPuG7774jOTk5QCVTD8sRvfnmm0yYMIHx48cDMGPGDNavX8+7777L5MmTg1s4P7vvvvvaPb/tttuYPn06W7du5fjjjw9SqQKvvr6eP/7xj9x88828/vrrwS5OQL3xxhv07duXW2+91XssLS0tiCUKrE2bNnHaaadx6qmnAp66r169ms2bNwe5ZP5zyimncMopp3T4mmVZLFu2jMsvv5xRo0YBcPvttzNjxgzWrl3L2LFjA1lUvzhS/WNjY3nggQfaHZs2bRozZ86krKyMfv36BaKIfnekNmhx4MABnnvuOe677z5+/etfB6hk6mE5LJfLxdatWxk+fLj3mM1mY/jw4WzatCmIJQuO2tpaAOLj44NcksB69tlnOeWUUxgxYkSwixJw69atIy8vj7lz5zJ9+nTuvvtu3nnnnWAXK2CGDBlCYWEhRUVFAGzfvp1vv/32qH+Z91b79u3D6XS2+38hNjaW/Pz8sPw7ETx/LxqGQWxsbLCLEjCmafLHP/6RSy+9lKysrIBeWz0sh1FZWYlpmiQlJbU7npSU5P0LLFyYpsnzzz/Pcccdx6BBg4JdnID54IMP2LZtG//7v/8b7KIExb59+3j77be55JJLmDJlClu2bOGvf/0rdrudcePGBbt4fjd58mTq6uq44447sNlsmKbJNddcw9lnnx3sogWF0+kEoE+fPu2O9+nTx/taOGlsbOQf//gHY8eODavA8sYbbxAREcFFF10U8GsrsMhRzZs3j127dvHwww8HuygBU1ZWxvPPP8/9999PZGRksIsTFKZpMnjwYKZOnQpAbm4uO3fu5O233w6LwPLhhx+yevVqfvrTn5KVlcX27dt5/vnnSU5ODov6y+G5XC5+//vfAzB9+vQglyZwtm7dyrJly5gzZ05QJp4rsBxGYmIiNpvtkH85OJ3OQ3pderN58+axfv16HnroIfr27Rvs4gTM1q1bqaio4J577vEeM02Tr7/+muXLl/Piiy9is/XuEdXk5GQGDhzY7tjAgQP5+OOPg1SiwHrhhRe47LLLvHMzBg0aRGlpKf/85z/DMrC0/L1XUVHRbqJlRUUFOTk5wSlUELSElbKyMn71q1+FVe/K119/TWVlZbt5baZpMn/+fJYtW8ZTTz3l1+srsByG3W4nLy+PwsJC7y1dpmlSWFjIxIkTg1w6/7Msi+eee45PPvmEWbNmhdVkS4Dhw4fzu9/9rt2xP/3pT2RmZnLZZZf1+rACcNxxxx0y/FlUVERqamqQShRYDQ0Nh/x3ttlshOv2a2lpaSQlJfHll196A0ptbS2bN2/mggsuCG7hAqQlrJSUlPDggw+SkJAQ7CIF1DnnnNNuXifA7NmzOeecc7w3p/iTAssRTJo0iaeeeoq8vDzy8/NZtmwZDQ0NYfGvq3nz5rF69WruvvtuYmJivD1NsbGxYTFEEhMTc8h8naioKBISEsJmHs8ll1zCAw88wOuvv86YMWPYvHkzK1as4Kabbgp20QJi5MiRvP766/Tr14+BAweyfft23nzzzYD8xRws9fX1lJSUeJ/v27eP7du3Ex8fT79+/bj44ot5/fXXycjIIC0tjZdffpnk5GTvXUM93ZHqn5SUxNy5c9m2bRv33HMPpml6/16Mj4/Hbu8dv06P9h04OKTZ7XaSkpICskaXdms+iuXLl7N48WKcTic5OTnceOONFBQUBLtYfveDH/ygw+O33nprWAS2jsyaNYucnJywWjju008/5cUXX6SkpIS0tDQuueQSvve97wW7WAFRV1fHK6+8wieffEJFRQUpKSmMHTuWK6+8stf8cjrYV199xUMPPXTI8XPPPZfbbrvNu3DcO++8Q21tLUOHDuXHP/5xr1lQ8kj1v+qqq7j99ts7/NyDDz7ICSec4O/iBcTRvgMHu+2227j44osDsnCcAouIiIiEvN4/EC8iIiI9ngKLiIiIhDwFFhEREQl5CiwiIiIS8hRYREREJOQpsIiIiEjIU2ARERGRkKfAIiIiIiFPgUVERERCngKLiIiIhDwFFhEREQl5CiwiIiIS8v4/ntHe9O96JmYAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.style.use('ggplot')\n",
    "plt.plot(list(map(lambda x: x.cpu(), accs)) if device == \"cuda\" else accs, label='train acc')\n",
    "plt.plot(list(map(lambda x: x.cpu(), val_accs)) if device == \"cuda\" else val_accs, label='validation acc')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from PIL import Image\n",
    "import numpy as np\n",
    "\n",
    "cifar_labels = [\n",
    "    \"airplane\",\n",
    "    \"automobile\",\n",
    "    \"bird\",\n",
    "    \"cat\",\n",
    "    \"deer\",\n",
    "    \"dog\",\n",
    "    \"frog\",\n",
    "    \"horse\",\n",
    "    \"ship\",\n",
    "    \"truck\"\n",
    "]\n",
    "\n",
    "def inference(image_file):\n",
    "    image = Image.open(image_file)\n",
    "    transform = transforms.Compose([\n",
    "        transforms.Resize((32, 32)),\n",
    "        transforms.ToTensor()\n",
    "    ])\n",
    "    tensor = transform(image)\n",
    "    tensors = tensor.reshape(1, 3, 32, 32)\n",
    "    tensors = tensors.to(device)\n",
    "    output = model(tensors)\n",
    "    max_index = torch.argmax(output[0])\n",
    "    inference = cifar_labels[max_index]\n",
    "    print(f\"it is a {inference}\")\n",
    "\n",
    "    img_np = np.transpose(tensor, (1, 2, 0))\n",
    "    plt.imshow(img_np)\n",
    "    plt.axis(\"off\")\n",
    "    plt.show()    \n",
    "\n",
    "    return inference"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.6"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
